さらにバネの動きもつけてみた
バネの動きも追加してみたけど、微妙に違う気がする…
摩擦の表現で速度に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();
}
}
}