In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

さらにバネの動きもつけてみた

バネの動きも追加してみたけど、微妙に違う気がする…
摩擦の表現で速度に1未満の値を掛けるのには違和感があるけど、
アニメーション的にはこんな感じでOKでしょうか。
@author エスケイ
* FITCTOKYOの復習的な。
* コメントいれるのめんどかったから変数に日本語使った。反省している。
/**
 * Copyright esukei ( http://wonderfl.net/user/esukei )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yvUA
 */

// forked from Nicolas's 床の摩擦をつけたよ
// バネの動きも追加してみたけど、微妙に違う気がする…
// forked from esukei's 比較的それっぽく動くボール。つかんで投げられるよ!
//摩擦の表現で速度に1未満の値を掛けるのには違和感があるけど、
//アニメーション的にはこんな感じでOKでしょうか。
/**
 * @author エスケイ
 * FITCTOKYOの復習的な。
 * コメントいれるのめんどかったから変数に日本語使った。反省している。
 */
package {
    import flash.display.Sprite;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;
    import flash.utils.Timer;
    [SWF(frameRate = "60")]
    public class FlashTest extends Sprite {
        private var X軸の加速度:Number = 0;
        private var Y軸の加速度:Number = 0;
        private var X軸の速度:Number = 0;
        private var Y軸の速度:Number = 0;
        private var 反発係数:Number = 0.6;
        private var 空気抵抗:Number = 0.995;
        private var 床の摩擦:Number = 0.95;
        private var 重力定数:Number = 0.5;
        private var バネ定数:Number = 0.01;
        private var 質量:Number = 1.0;
        private var ボール:Sprite;
        private var ボールの半径:Number = 10;
        private var 一フレーム前のX:Number;
        private var 一フレーム前のY:Number;
        private var タイマー:Timer;
        private var 一フレームあたりの時間:Number = 1000/60;
        private var マウスで掴まれている:Boolean = false;
        public function FlashTest() {
            
            ボール = new Sprite();
            ボール.x = stage.stageWidth / 2;
            ボール.y = stage.stageHeight / 2;
            ボール.graphics.beginFill(0xFFFF0000);
            ボール.graphics.drawCircle(0, 0, ボールの半径);
            
            ボール.addEventListener(MouseEvent.MOUSE_DOWN,function(event:MouseEvent):void{
                マウスで掴まれている = true;
            });
            
            //こっちの方が投げやすくないですか?
            //確かにこっちのが投げやすいですね…
            stage.addEventListener(MouseEvent.MOUSE_UP,function(event:MouseEvent):void{
                マウスで掴まれている = false;
            });
            
            addChild(ボール);
            
            タイマー = new Timer(一フレームあたりの時間);
            タイマー.addEventListener(TimerEvent.TIMER, function(event:TimerEvent):void{
                
                if(ボール.x + ボールの半径 > stage.stageWidth)
                {
                    ボール.x = stage.stageWidth - ボールの半径;
                    X軸の速度 *= -反発係数;
                    Y軸の速度 *= 床の摩擦;
                }
                
                if(ボール.x - ボールの半径 < 0)
                {
                    ボール.x = ボールの半径;
                    X軸の速度 *= -反発係数;
                    Y軸の速度 *= 床の摩擦;
                }
                
                if(ボール.y + ボールの半径 > stage.stageHeight)
                {
                    ボール.y = stage.stageHeight - ボールの半径;
                    Y軸の速度 *= -反発係数;
                    X軸の速度 *= 床の摩擦;
                }
                
                if(ボール.y - ボールの半径 < 0)
                {
                    ボール.y = ボールの半径;
                    Y軸の速度 *= -反発係数;
                    X軸の速度 *= 床の摩擦;
                }
                
                if(マウスで掴まれている)
                {
                    X軸の速度 = mouseX - 一フレーム前のX;
                    Y軸の速度 = mouseY - 一フレーム前のY;
                }
                else
                {
                    X軸の速度 = (X軸の速度 + (X軸の加速度 + バネ定数 * (mouseX - ボール.x) / 質量)) * 空気抵抗;
                    Y軸の速度 = (Y軸の速度 + (Y軸の加速度 + バネ定数 * (mouseY - ボール.y) / 質量 + 重力定数)) * 空気抵抗;
                }
                
                ボール.x += X軸の速度;
                ボール.y += Y軸の速度;
                
                一フレーム前のX = ボール.x;
                一フレーム前のY = ボール.y;
                
            });
            タイマー.start();
        }
    }
}