2014-02-16 133 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

我正在加载瓦片贴图,并且在不同的图层中有不可见的“对象”。这些对象决定我是否在某处发生了碰撞。它们不一定必须是它们所在的瓷砖的大小,因此是不可见的。 –