Java 2D游戏多态性

Java 2D游戏多态性,java,polymorphism,game-engine,Java,Polymorphism,Game Engine,我正在用Java开发一个简单的2D游戏,我被卡住了 我的所有游戏对象(敌人,玩家,物品,墙,…)都在扩展实体 Entity是一个抽象类,包含一些抽象方法,如update() 我制作了一个名为Drawable的接口,其中包含一个draw()方法 一些游戏对象,如项目应该是一个实体,但也应该是可绘制的,而另一些游戏对象,如墙,应该只是一个实体(不连接到平铺,只有x和y坐标) 一切看起来都是这样的: List<Entity> entities; for (Entity entity :

我正在用Java开发一个简单的2D游戏,我被卡住了

我的所有游戏对象(
敌人
玩家
物品
,…)都在扩展
实体

Entity
是一个抽象类,包含一些抽象方法,如
update()

我制作了一个名为
Drawable
的接口,其中包含一个
draw()
方法

一些游戏对象,如
项目
应该是一个
实体
,但也应该是
可绘制的
,而另一些游戏对象,如墙,应该只是一个
实体
(不连接到平铺,只有x和y坐标)

一切看起来都是这样的:

List<Entity> entities;
for (Entity entity : entities) {
    entity.draw(g);
}
我的问题是:我应该如何绘制我的
Drawable
s

我希望能够做到以下几点:

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

但是由于所有实体都没有
draw()
方法,所以我不能这样做。我不认为
如果(实体instanceof Drawable)
是个好主意。

您可以使用
instanceof
操作符测试
实体是否实现了
Drawable

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

保留额外的可提取物品集合。这样,您可以限制绘制这些实体,并对所有实体执行所有其他操作。

首先,您的墙是不可见的?第二,我喜欢其他两个答案:您可以保留一个Drawable集合,或者检查该集合是否实现了Drawable


第三种选择是让所有实体实现可绘制,并将墙的实现留空。

通常的做法是模型类对绘制一无所知。相反,您有一些GUI类,它们包含您的模型类,并且知道如何绘制它们。这样,你也可以重用所有的代码,以防你想在不同的设备上显示你的游戏,例如,谢谢!我在我的问题中写了这篇文章,但在游戏循环中使用它真的有效吗?@OscarLinde-使用
instanceof
对性能的影响可能是微不足道的,即使在游戏循环中也是如此。例如,请参见。此外,图形本身可能比
instanceof
昂贵得多。如果您在大量非
可绘制
实体
对象中只有几个
可绘制
对象,那么这将是一个很好的方法。您好,谢谢您的回答!我也想到了这一点,但是没有其他更简单的方法吗?也许只是我太懒了。这不需要太难,如果你做了一些自动化的事情,那么无论何时你创建一个可绘制文件,它都会被添加到一个可绘制文件列表中。谢谢,这听起来既聪明又高效!我正在加载一个平铺贴图,在一个单独的图层中有不可见的“对象”。这些物体决定了我是否在某处发生了碰撞。它们不一定非得和它们所在的瓷砖一样大,因此是看不见的。