互いに縛られる2点
ステージクリックで初期化
点の数を2つにして、それぞれが互いに追いかけるターゲットに設定。
ステージ境界で速度成分を -2 倍してるので、ぶつかるだびに急加速。
最終的には斜めな四角形を描く軌道になる(ことが多い)
/*
ステージクリックで初期化
点の数を2つにして、それぞれが互いに追いかけるターゲットに設定。
ステージ境界で速度成分を -2 倍してるので、ぶつかるだびに急加速。
最終的には斜めな四角形を描く軌道になる(ことが多い)
*/
package
{
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.ColorTransform;
[SWF(width="400", height="400", backgroundColor="0x000000", frameRate="30")]
public class Index extends MovieClip
{
private const PI:Number = Math.PI;
private const NUM:uint=2;
private const MAX_SPEED:uint=20;
private var ptArray:Array=[]; //各点
private var tgtArray:Array=[]; //各ターゲット
private var radArray:Array=[]; //各点のターゲットとの角度
private var spArray:Array=[]; //各点の速度、2次元配列
private var org_mc:MovieClip = new MovieClip();
private var bmpDat:BitmapData = new BitmapData(400, 400, false, 0x000000);
private var bmp:Bitmap = new Bitmap(bmpDat);
public function Index():void
{
ptArray.push( new Point(0, 400*Math.random()) );
ptArray.push( new Point(400, 400*Math.random()) );
mcInit( ptArray[1] );
mcInit( ptArray[0] );
addChild(bmp);
addEventListener(Event.ENTER_FRAME, mv);
stage.addEventListener(MouseEvent.CLICK, init);
}
private function init(mEvt:MouseEvent):void
{
ptArray[0].x = 0;
ptArray[0].y = 400*Math.random();
ptArray[1].x = 400;
ptArray[1].y = 400*Math.random();
spArray=[ [0, 0], [0, 0] ];
}
private function mcInit(tgt:Object):void
{
tgtArray.push( tgt );
radArray.push(0);
spArray.push( [0, 0] );
}
private function mv(evt:Event):void
{
org_mc.graphics.clear();
org_mc.graphics.lineStyle(1, 0x00FFFF, 0.2);
org_mc.graphics.moveTo(ptArray[0].x, ptArray[0].y);
org_mc.graphics.lineTo(ptArray[1].x, ptArray[1].y);
org_mc.graphics.lineStyle();
org_mc.graphics.beginFill(0xFF0000, 0.2);
org_mc.graphics.drawCircle(ptArray[0].x, ptArray[0].y, 3);
org_mc.graphics.endFill();
org_mc.graphics.beginFill(0xFF00FF, 0.2);
org_mc.graphics.drawCircle(ptArray[1].x, ptArray[1].y, 3);
org_mc.graphics.endFill();
bmpDat.colorTransform( bmpDat.rect, new ColorTransform(1, 1, 1, 1, 0, 0, 0, -1) );
bmpDat.draw(org_mc);
for(var i:uint=0; i<NUM; i++){
radArray[i] = Math.atan2( tgtArray[i].y-ptArray[i].y, tgtArray[i].x-ptArray[i].x );
var dd:Number = (tgtArray[i].y-ptArray[i].y)*(tgtArray[i].y-ptArray[i].y) + (tgtArray[i].x-ptArray[i].x)*(tgtArray[i].x-ptArray[i].x);
if(dd<1){ dd = 1; }
else if(dd > 2){ dd = 2; }
spArray[i][0] += Math.cos( radArray[i] ) / dd;
spArray[i][1] += Math.sin( radArray[i] ) / dd;
if(spArray[i][0] > MAX_SPEED){ spArray[i][0] = MAX_SPEED; }
else if(spArray[i][0] < -MAX_SPEED){ spArray[i][0] = -MAX_SPEED; }
if(spArray[i][1] > MAX_SPEED){ spArray[i][1] = MAX_SPEED; }
else if(spArray[i][1] < -MAX_SPEED){ spArray[i][1] = -MAX_SPEED; }
ptArray[i].x += spArray[i][0];
ptArray[i].y += spArray[i][1];
if(ptArray[i].x<0){
ptArray[i].x=0;
spArray[i][0] *= -2;
}
else if(ptArray[i].x>400){
ptArray[i].x=400;
spArray[i][0] *= -2;
}
if(ptArray[i].y<0){
ptArray[i].y=0;
spArray[i][1] *= -2;
}
else if(ptArray[i].y>400){
ptArray[i].y=400;
spArray[i][1] *= -2;
}
}
}
}
}