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

posted @ 2013-12-30 09:35  无名盗闪  阅读(220)  评论(0)    收藏  举报