QuickBox2Dを試してみた 衝突

matsu45122010-08-05



今回は衝突の検出についてです。
衝突した位置と衝突時の力の大きさの取得をやってみました。

サンプル
衝突を検出した座標に円を描画。


ソース

package
{
	import com.actionsnippet.qbox.*;
	
	import flash.display.*;
	import flash.events.Event;
	
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.tweens.ITween;
	
	[SWF(backgroundColor=0, width=500, height=500)]
	public class QB_5 extends MovieClip
	{
		private const SCALE:int = 30, BALL:int=10, W:int=500, H:int=500;
		private var sim:QuickBox2D;
		private var contact:QuickContacts;
		public function QB_5()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			sim = new QuickBox2D(this);
			sim.createStageWalls();
			
			for(var i:int = 0; i < BALL; i++)
				sim.addCircle({x:Math.random()*500/SCALE, y:Math.random()*500/SCALE, radius:(Math.random()*20+10)/SCALE});
			
			//衝突イベントの登録
			contact = sim.addContactListener();
			contact.addEventListener(QuickContacts.ADD, onContact);
			
			sim.mouseDrag();
			sim.start();
		}
		
		private function onContact(e:Event):void{
			var circle:Sprite = new Sprite();
			circle.graphics.lineStyle(3,0xFF0000);
			circle.graphics.drawCircle(0,0,5);
			addChild(circle);
			//衝突した座標の取得
			circle.x=contact.currentPoint.position.x*SCALE;
			circle.y=contact.currentPoint.position.y*SCALE;
			//力の取得
			var stl:Number = contact.currentPoint.velocity.Length()/5;
			//力の大きさに合わせて円を大きくする
			var t:ITween = BetweenAS3.to(circle, {scaleX:stl, scaleY:stl, alpha:0}, 1);
			t.onCompleteParams = [circle];
			t.onComplete = function(c:Sprite):void{removeChild(c)};
			t.play();
		}
	}
}