我正在用Java编写一个简单的游戏,但我正试图用一个漂亮的干净的设计和没有hack来做‘正确的’。
我有两个类GamePanel
和Model
,前者接收点击和按键,后者包含所有实体并负责它们的更新。模型需要知道用户的鼠标在哪里,但我不能决定“正确”的方式。
Model
和其中的每个Entity
应该保留对GamePanel
的引用,还是只缓存上一次已知的鼠标位置并定期从GamePanel
接收更新。对于第一个选项,在创建模型时,需要为其提供对GamePanel
的引用,而对于第二个选项,最后一个鼠标位置将作为参数发送给World.update()
方法。
这两个解决方案看起来都不优雅,所以我想知道是否有一个“正确”的方法来做这件事,我错过了。
谢谢,本。
发布于 2009-07-17 20:24:33
在我看来,这取决于你的类是如何交互的。鼠标位置的变化是否会触发Model类中的实体?或者模型类独立于GamePanel,并且只作用于鼠标位置的当前值?
如果是后者,在这种情况下,我同意杰夫在我之前说过的话。在创建模型类时,将GamePanel上的句柄传递给它,并让每个实体在需要时使用该句柄访问鼠标位置。这样,将始终使用更新后的鼠标位置。
如果是前者,我建议使用观察器让Model类知道鼠标位置值何时发生了变化。然后,模型类可以使用相同的设计(即,让模型类始终拥有GamePanel类的句柄),并访问GamePanel中的当前值。
总而言之,我对您的问题的回答是,让GamePanel保存鼠标位置的值,并让其他类使用GamePanel实例访问该信息,这才是符合OO概念的。
谢谢,罗翰。
发布于 2009-07-17 20:25:39
一种常见的解决方案是触发事件。在这种情况下,GamePanel将触发一个事件,通知Model中所有感兴趣的(订阅该事件)对象(实体)新的鼠标位置。
通过这种方式,GamePanel不需要显式地知道要通知哪些实体,这些实体也不需要保留GamePanel的实例。
我的建议是:读一读事件监听器。(Java.util)
发布于 2009-07-17 20:16:00
您可以始终将当前坐标设置为GamePanel的公共属性,以便实体/模型可以简单地从那里访问它。
https://stackoverflow.com/questions/1145427
复制相似问题