久々に技術ネタを。
■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フレームワーク意識してます)