Starling 游戏 太空大战5 子弹与怪物的碰撞
对于碰撞的测试我们来看看两个不同验证方式的演示
1:对象矩形碰撞
2:对象距离碰撞
由此我们可以判断在像素级别上的碰撞测试中,尤其是在Starling 框架的游戏中,基于距离的碰撞测试将更敏感的工作。
接下来我们就通过代码来实现,由于在舞台上会同时出现大量的怪物和子弹飞扬。要同时判断他们的碰撞我们最好使用
一个管理类来控制CollisionManager.as
package managers { import flash.geom.Point; import object.Alien; import object.Bullet; import core.Game; import core.Assets; import states.Play; public class CollisionManager { private var play:Play; private var p1:Point = new Point(); private var p2:Point = new Point(); private var count:int = 0; public function CollisionManager(play:Play) { this.play = play; } public function update():void { if(count &1) bulletsAndAliens(); else heroAndAliens(); count++; } //外星人与子弹的碰撞 private function bulletsAndAliens():void { var ba:Array = play.bulletManager.bullets; var aa:Array = play.alienManager.aliens; var b:Bullet; var a:Alien; for(var i:int=ba.length-1;i>=0;i--){ b=ba[i] for(var j:int=aa.length-1;j>=0;j--){ a= aa[j]; p1.x = b.x; p1.y = b.y; p2.x = a.x; p2.y = a.y; if(Point.distance(p1,p2) < a.pivotY + b.pivotY) { Assets.explosion.play(); //爆炸效果,外星人的坐标 play.explosionManager.spawn(a.x,a.y); play.alienManager.destroyAlien(a); play.bulletManager.destroyBullet(b); play.score.addScore(200); } } } } //如果飞机与外星人碰撞到则游戏结束 private function heroAndAliens():void { var aa:Array = play.alienManager.aliens; var a:Alien; for(var i:int = aa.length-1;i>=0;i--){ a = aa[i]; p1.x = play.hero.x; p1.y = play.hero.y; p2.x = a.x; p2.y = a.y; if(Point.distance(p1,p2) < a.pivotY + play.hero.pivotY) { play.game.changeState(Game.GAME_OVER_STATE); } } } } }
代码分析:
首先我们要有一个逐帧更新的update函数();
在函数中我们同时进行两组对象的碰撞判断,子弹跟怪物的碰撞 bulletsAndAliens() 和 飞船跟怪物的碰撞 heroAndAliens();
在物体碰撞中使用双循环逐一判断,判断的条件就是物体间的距离 Point.distance(p1,p2) < a.pivotY + b.pivotY

浙公网安备 33010602011771号