2013-12-19 37 views
3

我正在设计一个2D游戏来练习Java和面向对象的编程(如果有帮助的话,我使用JSFML库)和I对如何最好地设计以下内容有疑问:OOP设计:如何确定程序流程和负责方法的类(JSFML库)

我使用的库提供了由可见游戏元素(玩家,敌人,背景等)实现的Drawable界面。我也有一个RenderWindow,我将绘制Drawable对象。

这里的东西,RenderWindowdraw(Drawable d)方法借鉴了当前窗口中Drawable对象,而Drawable对象都有一个draw(RenderWindow r)方法借鉴了RenderWindow中流过的电流Drawable对象。

如果他们做基本相同的事情,我应该使用哪一个?为什么?我应该考虑什么来决定?我使用HashMap来存储Drawable对象。我应该将RenderWindow传递给HashMap中的Drawables,还是将HashMap中的Drawables传递给RenderWindow?任何建议表示赞赏。

回答

1

您的问题的一条线路答案是
Java语言不支持双重调度机制。

怎么办:图书馆希望你重写这些方法,但从来没有打电话给他们。我没有使用库,但从游戏引擎的一些经验,我猜应用程序将调用RenderWindow的绘制,它最终会调用所有Drawable的绘制方法。 (Drawables集合将由RenderWindow维护

原因: Java通过检查调用方法的对象类(不是通过检查引用)来动态调用该方法,这称为(您可能知道)动态调度
但是该方法的参数仅通过检查引用来选择(而不是通过作为参数传递的实际对象的类别)。
这里,通过强制动态调度两次(通过为同一目的制作两种方法),图书馆开发人员间接实现双重调度

将来,您可能需要扩展Drawable和RenderWindow,如果您已经绘制了方法i只有Drawable,你不能为RenderWindow的每个孩子分别绘制。双派遣解决了这个问题。

希望这有助于。

+0

我不明白,为什么我应该重写这些方法? RenderWindow.draw(Drawable d)有一个工作实现(Drawable由Sprite实现,这是另一个库类,我没有提到它使问题更简单,认为没关系)。库(JSFML)本质上是C++库的包装,如果这有所作为。 –

+1

RenderWindow将有一个标准的实现,您只会在极少数情况下重写。 Drawable的方法必须被覆盖。但正如你所指出的,库提供了一个参考实现(Sprite)(但有时你需要你自己的,比如AnimatedSprite)。所以你只需要在大多数简单的情况下将Sprites添加到RenderWindow中。 (这是建立一个图书馆的目的,几乎所有东西都已经实施)。我只是试图解释图书馆开发人员可能不会立即需要的设计注意事项。 –