0

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

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

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

现在我想通过在比赛场地上拥有多个敌人来扩展游戏。每一波敌人的数量可能不同,所以我真的不想单独跟踪它们。

当我想创建一个敌人时,我会调用(在我的主类中)

this.addChild(createNewEnemy());

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

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

4

2 回答 2

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

于 2012-04-24T22:14:38.247 回答
1

你好!

我真的不明白您所说的“匿名”是什么意思,但解决方案之一是创建所谓的hitboxes

让我们假设你有一个 Enemy 类:

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) ;
    }
}

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

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 */
          }
       }
    }
}

注意:hitboxes 确实只提供了一些正方形区域。如果您需要一些确切的碰撞细节,请创建几个碰撞箱。

我希望这个能帮上忙 !:)

于 2012-04-25T00:09:56.083 回答