2012-04-24 46 views
0

我有一个在AS3中制作的基本太空射击游戏。对匿名对象执行命中测试

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

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

现在我想通过在比赛场上有一个以上的敌人来扩大比赛。每个波浪的敌人数量可能不同,所以我不想单独追踪它们。

当我要制造一个敌人,我叫(从我的主类中)

this.addChild(createNewEnemy()); 

与createNewEnemy()函数创建,并返回一个匿名的敌方目标。

我的问题是,我该如何对玩家发射子弹时对这些匿名敌人进行命中测试?当一个敌人与一颗子弹相撞时,它应该被移除并且分数应该增加。

回答

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

+0

我试图看看我是否可以逃脱没有跟踪我的所有敌人。似乎这是不可能的。至少现在,矢量更容易!请注意你的语法中的一些错误:它应该是Vector。 和addChild方法需要返回一个DisplayObject。所以我只是返回super.addChild(child)方法,它停止抱怨。 – getack 2012-04-25 07:27:14

+0

对,对不起!我只是把它从头顶敲下来,没有打扰检查任何东西。我会编辑答案。 – 2012-04-25 07:41:49

+0

我不知道为什么Adobe在他们的模板参数括号之前放了一段时间......太愚蠢了。用于在C++中执行它,因此我的代码中有错误。很高兴它适合你,但。 – 2012-04-25 07:42:54

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

有很多敌人,所以只需要创建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确实提供只有一些方形区域。如果您需要一些确切的碰撞细节,请创建几个点击框。

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

+0

hitTest本身对我来说没有问题。我的意思是匿名的是当我创建它时,我没有给该对象赋予变量名称。我简单地制作,并添加到主容器中。不过谢谢! :) – getack 2012-04-25 06:55:38

+0

好吧,你所做的只是执行:enemyArray.push(new Enemy())所以,你的敌人不会被命名,但会在数组中有自己的索引,所以你可以追踪他们和他们的属性:)不用谢! – vikingmaster 2012-04-25 10:22:36

+0

我做了类似于您的建议。我使用了一个Vector,每个人都通过一个简单的矢量。当屏幕上的敌人数量很多(> 1000)时,它会变得很迟钝,但这只是为了演示目的,所以没关系。 – getack 2012-04-26 09:11:51