2014-02-16 182 views
0

我正在用Java開發一個簡單的2D遊戲,並且卡住了。Java 2D遊戲多態性

我所有的遊戲對象(EnemyPlayerItemWall,...)正在擴展Entity

Entity是一個抽象類,包含一些抽象方法,如update()

我做了一個名爲Drawable的接口,其中包含draw()方法。

一些遊戲對象,如Item應該是一個Entity也算是Drawable而其他國家,像華爾街,應該只​​是一個Entity(未連接到瓷磚,只是X和Y座標)

這一切看起來像這樣的:

List<Entity> entities; 

在構造函數中我這樣做:

entities = tileMapReader.getEntities(); 

我的問題是:我應該如何畫我的Drawable

我希望能夠做這樣的事情:

for (Entity entity : entities) { 
    entity.draw(g); 
} 

但是,由於所有實體沒有draw()方法我不能這樣做。我不認爲if (entity instanceof Drawable)是這樣一個好主意。

+0

你通常做的是模型類不知道被繪製的任何東西。相反,您有一些GUI類,它們包含您的模型類並知道如何繪製它們。這樣,您還可以重用所有代碼,以防您想在不同設備上顯示您的遊戲,例如 – xp500

回答

1

保持可繪製額外的集合。這樣你可以限制繪製這些,併爲所有實體做所有其他事情。

+0

你好,謝謝你的回答!我想到了這一點,但沒有其他更簡單的方法嗎?也許這只是我的懶惰。 –

+0

如果您進行某種自動化操作以便每次創建Drawable時都不需要困難,它也會添加到Drawable列表中。 – Kayaman

+0

謝謝,這聽起來很聰明和高效! –

1

您可以測試一個Entity工具Drawable使用instanceof運營商是否:

for (Entity entity : entities) { 
    if (entity instanceof Drawable) { 
     ((Drawable) entity).draw(g); 
    } 
} 
+0

謝謝!我在我的問題中寫了這個,但是在遊戲循環中真的有效嗎? –

+0

@OscarLinde - 即使在遊戲循環中,使用'instanceof'的性能可能並不重要。例如,參見[this thread](http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in-java)。另外,繪圖本身可能比'instanceof'昂貴得多。如果在非'Drawable'' Entity'對象的廣闊海洋中只有一些'Drawable'對象,那麼[Kayaman的答案](http://stackoverflow.com/a/21814808/535871)將是一個很好的方法。 –

0

首先,你的牆壁是不可見的?其次,我喜歡其他兩個答案:您可以保留一個Drawable集合,或者檢查它是否實現Drawable。

第三種選擇是讓所有實體都實現drawable並讓Wall的實現保持空白。

+0

我正在加載瓦片貼圖,並且在不同的圖層中有不可見的「對象」。這些對象決定我是否在某處發生了碰撞。它們不一定必須是它們所在的瓷磚的大小,因此是不可見的。 –