常に進行方向を向きながら回転する物体。その動きをスクリプトで記述してみます。動きをスクリプトで記述することのメリットは、パラメータを変えるだけで物の動きを制御できたり、また、手作業では不可能な動きを作り出せることもあることにあります。
今回はこれ↓をプログラミングしてみましょう。
flash player required.
回転運動をする物体のクラスを作成し、引数で渡すMovieClipのonEnterFrameハンドラをつかまえて動きをつけます。回転運動の中心の座標と、回転確度も指定できるようにします。以下、クラスの記述です。
class MyUnit{
var mc:MovieClip;
var nXCenter,nYCenter:Number;
var nAngle:Number;
var nCos,nSin:Number;
function MyUnit(mcIn:MovieClip,nXCenterIn:Number,
nYCenterIn:Number,nAngleIn:Number){
this.mc = mcIn;
this.nXCenter = nXCenterIn;
this.nYCenter = nYCenterIn;
this.nAngle = nAngleIn;
this.nCos = Math.cos(this.nAngle);
this.nSin = Math.sin(this.nAngle);
var owner:Object = this;
this.mc.onEnterFrame = function(){owner.McOnEnterFrame();}
}
function McOnEnterFrame(){
var nX:Number = this.mc._x - this.nXCenter;
var nY:Number = this.mc._y - this.nYCenter;
var nXNew:Number = nX * this.nCos - nY * this.nSin + this.nXCenter;
var nYNew:Number = nX * this.nSin + nY * this.nCos + this.nYCenter;
this.mc._rotation = (180 / Math.PI) *
Math.atan2(nYNew - this.mc._y,nXNew - this.mc._x);
this.mc._x = nXNew;
this.mc._y = nYNew;
}
}
1行目:MyUnitという名前でクラスを作成します。もちろん何でも構いません。
2行目:回転運動をさせるMovieClip。そして、
3行目:(回転の)中心座標、
4行目:フレームあたりの回転確度。これらをコンストラクタの引数で受け取ります。
5行目:回転の計算に使用する変数。13-14行目で計算し、22-23行目で使用します。
6-7行目:ここからコンストラクタの記述。
8-11行目:受け取った引数をプロパティに格納します。
13-14行目:回転の計算に使用する変数。22-23行目で使用します。
16行目:MovieClipのスコープからクラスのメソッドにアクセスするための変数。
17行目:onEnterFrameハンドラをオーバーライドします。19行目からのメソッドを実行します。
19行目:onEnterFrameハンドラで実行されるメソッド。
20-23行目:回転の計算。計算式の詳細は割愛させてください。たしか高校の数学でやった気が。
24-25行目:MovieClipが進行方向を向くようにします。atan2が便利。
26-27行目:MovieClipの新しい位置を代入。
そして、このクラスのオブジェクトを生成する記述は以下。
var oUnit:Object = new MyUnit(this.mcUnit,Stage.width * 0.5,Stage.height * 0.5,0.1);
mcUnitというのは、回転させる対象のMovieClip。回転の中心は、ステージの中心を指定します。回転確度の単位はここではラジアン。度数にしたい場合は、(度数)*(Math.PI / 180)を引数で渡せばOK。
動きを決定する要素にランダムな数値を加えてやることで、生命感のある飽きさせない動きなども表現できるかもしれません。そのようなことは、スクリプト制御だからこそ可能な表現ですね。
ご参考になれば嬉しいです。m( __ __ )m