2013-01-20 40 views
5

我有一個數組列表作爲這樣:如何僅迭代特定類型的元素?

private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>(); 

GameObject可以是3類中的一個:SpaceshipBeamAsteroid。它們都是相似的,所以我把它們放在一個陣列中。然而宇宙飛船有其他線程中每100ms使用的加法拍攝(叫做ShootRunnable)。所以我只想在Spaceship中迭代它,因爲其他的不實施拍攝方法。達到此目的的最佳方法是什麼?

for (GameObject ob : gameObjects) { 
    if (ob instanceof Spaceship) { 
    ob.shoot(); 
    } 
} 

我可以使用類似上面的方法遍歷它嗎?只需使用演員或其他東西?請幫忙。

回答

2

你在的路徑在技術上是可行的,但一個好的經驗法則是,如果你開始使用反射,你可能做錯了什麼。在這種情況下,擁有兩個集合,一個用於所有遊戲類型,另一個專門用於太空船可能是最明智的。

+0

這就是我想到的。但是,與宇宙飛船有關的每一個行動我都要做兩次。因此,當我添加新的太空船時,我將不得不將它添加到gameObjects列表和宇宙飛船?當刪除時,從gameObjects和宇宙飛船中刪除它。 :/但你認爲它是最好的方式? –

+0

正確。別擔心,電腦速度很快。 :) – Will

+0

好吧,這就是我將如何做。非常感謝 –

0

你應該把你的shoot()方法放到Spaceship類中,因爲沒有asteriod或beam會使用這個方法。完成這一點,你還應該至少保留兩個集合。其中一個應該只包含你的飛船。

2

在你的遊戲中,有沒有其他的動作會定期發生?

如果是這樣,您可以將shoot()方法更改爲抽象方法(可以命名爲periodicAction())並將其放入GameObject類中。該課程將通過拍攝來實施該方法,其他課程以其特定的週期性行爲和課程無所作爲。

+0

增加了不必要的複雜性 – Archer

+0

@archer:不,它不。遊戲開發中常見的做法是在遊戲中的每個實體上添加更新/步驟/打勾/思考功能。以idEntity的厄運3代碼爲例(第172行):https://github.com/id-Software/DOOM-3/blob/master/neo/game/Entity.h – Jack

0

我寧願做這樣:

Iterator<Spaceship> getSpaceships(){ 
    // return Iterator over Spaceship objects through use of instanceof 
} 

... 
Iterator<Spaceship> it = getSpaceships() 
while(iter.hasNext()) it.next().shoot() 

對我來說,它看起來更加清晰。

+1

「任何時候你發現自己在編寫代碼的形式「,如果對象是T1類型的,那麼做一些事情,但如果它是T2類型的,那就做一些其他的事情吧,'打你自己'。 --Scott Meyers,Effective C++ – prasopes

+0

這不是我的設計人員;)我只是試圖建議一個可行的渠道 – Archer

+0

但你建議使用instanceof,只隱藏在一個迭代器 – prasopes

0

你可以創建一個接口Action或方法爲GameObject

public interface Action { 
    void performAction(); 
} 

public abstract class GameObject implements Action { 
    //... 
    public void performAction() { 
     // subclasses should override this method. 
     // otherwise, it will do nothing. 
    } 
} 

然後,實施Spaceship

public class Spaceship extends GameObject { 
    @Override 
    public void performAction() { 
     this.shoot(); 
    } 
} 

BeamAsteroid,你可以離開的方法performAction

然後,你可以通過:

for (GameObject ob : gameObjects) { 
    ob.performAction(); 
} 
相關問題