对匿名对象执行命中测试

时间:2012-04-24 22:05:40

标签: actionscript-3 hittest

我有一个用AS3制作的基本太空射击游戏。

游戏目前由一个敌人和一个玩家组成 - 一个可移动的炮塔。

游戏的前提是,当敌人被击中时,它会重生,并且玩家得分会上升一点。

现在我希望通过在比赛场地上拥有多个敌人来延长比赛时间。每个波的敌人数量可能不同,所以我真的不想单独跟踪它们。

当我想创造一个敌人时,我打电话(从我的主要班级内)

this.addChild(createNewEnemy());

创建createNewEnemy()函数,并返回一个匿名的Enemy对象。

我的问题是,如何在玩家射击子弹的情况下对这些匿名敌人进行命中测试?当敌人与子弹发生碰撞时,应该将其移除并且分数应该增加。

2 个答案:

答案 0 :(得分:1)

我不太确定“匿名对象”是什么意思。你真的应该以能跟踪它们的方式创造这些东西。一种方法可能是覆盖容器精灵的addChild方法并将新敌人推送到矢量。例如:

var enemies:Vector.<Enemy> = new Vector.<Enemy>();

override public function addChild(child:DisplayObject):DisplayObject
{
    if(child is Enemy) {
       enemies.push(child);
    }
    super.addChild(child);
}

现在您只需针对敌人矢量进行测试,或者在子弹碰撞中使用相同的“is”关键字来检查并查看碰撞的显示对象是否基于类型Enemy

就进行碰撞检测的实际代码而言,请参阅以下答案:https://stackoverflow.com/a/7083965/562566

答案 1 :(得分:1)

您好!

我真的不明白你的意思是“匿名”,但其中一个解决方案是创建所谓的 hitboxes

让我们假设你有一个敌人类:

public class Enemy {
    public var hitBox:Sprite = new Sprite() ;

    public function Enemy() {
        hitBox.graphics.clear() ; /* Not filled by a color, as needs to be invisible */
        hitBox.graphics.drawRect(x,y,width,height) ; /* Adjust the parameters manually */
        this.addChild(hitBox) ;
    }
}

有很多敌人,所以只需创建敌人阵营并将敌人推入其中。 这是玩家的子弹:

public class PlayerBullet extends Sprite {
    private var stageReference:Stage ;
    public function PlayerBullet(coord:Point, stageReference:Stage){
        this.x = coord.x ;
        this.y = coord.y ;
        this.stageReference = stageReference ;
        this.stageReference.addChild(this) ;
        this.addEventListener(Event.ENTER_FRAME, loop) ;
    }

    private function loop(e:Event){

        /*Provide some movement for bullet by changing or incrementing
          this.x and this.y as you wish */

        for (var i:Number = 0 ; i < enemyArray.length ; i++){
          if (this.hitTestObject(enemyArray[i].hitBox)) {
              enemyArray.splice(i,1) ; /* Remove the enemy from enemy array on collision */
              this.stageReference.removeChild(this) ; /* Do not display bullet anymore on collision with enemy */
          }
       }
    }
}

注意:hitbox只提供一些方形区域。如果您需要一些碰撞的精确细节,请创建几个hitbox。

我希望,这会有所帮助! :)