久々に技術ネタを。

■sample

ライン上をオブジェクトが回転しながら移動する(fla, code archive)

「ライン上を移動」という意味ではこっちの方がわかりやすいかも(回転なし, 回転あり)



■技術的なこと

2つのactionscriptクラスを作りました。

RotPoint.as

mc._rotation(回転)の属性を追加した、座標を表すPointクラスの拡張のような物です。

RotMoveController.as

座標を複数addPoint(x, y, rotation)し、moveMC(mc, 位置)するとその線上にmcを移動させます。

partition:Number属性の値分だけ、座標間を分割します。

つまり、座標数が5で、partitionが10の場合、RotMoveControllerクラスの線は1+10*(5-1) = 41分割されます。

そして、moveMC(mc, 0~40) を実行すると、その分割された線分上の点に配置されます。

■code

flaより

dの絶対値を少しずつ減らしながら(0.9倍)、その分だけonEnterFrame()内の処理で線上での位置をずらしていく。

//移動のコントローラ

importRotMoveController;

varcontroller:RotMoveController=newRotMoveController();

controller.partition=50;//移動点の間の分割量

varnow=0;

vard=1;//変化量

varmcList:Array=newArray();

//移動する点を設定

controller.addPoint(-100,200,60);//x,y,rotation

controller.addPoint(200,300,0);

controller.addPoint(440,300,0);

controller.addPoint(740,200,-60);

trace(controller.total+”分割”);

//controller.drawPoints();//ラインで表示

//移動させるMC配置

for(vari=0;i<100;i++){

vardepth=this.getNextHighestDepth();

varmc:MovieClip=this.attachMovie(“MoveItem”,”moveItem_”+depth,depth,{title:depth});

mc.pos=0;//初期位置

controller.moveMC(mc,mc.pos);

mcList.push(mc);

}

this.onEnterFrame=function(){

now+=d;

d*=0.9;

for(vari=0;i
varmc:MovieClip=mcList[i];

mc.pos=now-i*25;//25間隔

controller.moveMC(mc,mc.pos);//無茶な位置を指定したら無視されるのでok

}

}

//左ボタン

tL.onRelease=function(){

d-=5;

}

//右ボタン

tR.onRelease=function(){

d+=5;

}

ちなみに実際にPileusのViewコンポーネントでも使っているクラスです。Pileusでは、「受け取った配列をただ表示するFlash」と「ハードウェアからの入力やPileusWebserviceの状態から、何を表示するか決定するWindowsアプリ」と「色々なWebServiceのフォーマットを直したりログイン処理を代行するPileus用webAPI」に分割する事で結構綺麗に実装できました。(フラクタルなMVCフレームワーク意識してます)