QuickBox2Dを試してみた 衝突
今回は衝突の検出についてです。
衝突した位置と衝突時の力の大きさの取得をやってみました。
サンプル
衝突を検出した座標に円を描画。
ソース
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(); } } }