物理法則をクラス化した「PhysicalPoint」クラス。
AS3用クラスとして本に紹介されていたものをAS2(Flash8以上)に移植してみた。
「setKasokudo」メソッドでxyのターゲットまでの加速度、空気抵抗を設定すると、現在のx座標とy座標を返してくれる。
参考資料『SoftBank Creative「Flash デザインラボ CaseStudy11 古堅真彦 著」』
以下、コード。
「PhysicalPoint.as」
import flash.geom.Point;
class PhysicalPoint extends Point{
//プロパティ
var vx,vy:Number;//速度
private var ax,ay:Number;//加速度
var resistance:Number;//空気抵抗
var preTime:Number;//前回のミリ秒
var curTime:Number;//今回のミリ秒
//コンストラクタ
public function PhysicalPoint(xx:Number,yy:Number,resist:Number){
x=xx;
y=yy;
resistance=resist;
vx=0;
vy=0;
ax=0;
ay=0;
preTime=new Date().getTime();
setInterval(this,'loop',33);
}
//メソッド
function loop():Void{
curTime=new Date().getTime();
var t:Number=(curTime-preTime)/1000;
//x,yの座標
x+=vx*t+0.5*ax*t*t;
y+=vy*t+0.5*ay*t*t;
//速度計算
vx+=ax*t;
vy+=ay*t;
//空気抵抗適用
vx*=resistance;
vy*=resistance;
//加速度を0に戻す
ax=0;
ay=0;
preTime=curTime;
}
function setKasokudo(aax:Number,aay:Number):Void{
ax+=aax;
ay+=aay;
}
}
これの面白いところは、無機質なイージングなどと違って、物理法則にのっとっているため、ユーザに親近感を覚えさせるところ。このクラスを使って、簡単なサンプルを作ってみた。
【製作過程】
画面サイズは300x300。
「PhysicalPoint.as」と同階層にflaファイルをつくり、以下のコードをタイムライン弟1フレームに記述。
var pt:PhysicalPoint=new PhysicalPoint(Stage.width/2,Stage.height/2,0.9);
setInterval(loop,33);
function loop():Void{
pt.setKasokudo((_root._xmouse-pt.x)*10,(_root._ymouse-pt.y)*10);
clear();
_root.lineStyle(3,0xFF0000);
_root.moveTo(0,0);
_root.lineTo(pt.x,pt.y);
}

コメントする