2012-04-24 42 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