OO游戏设计问题

时间:2009-07-17 20:09:41

标签: java design-patterns oop

我正在用Java编写一个简单的游戏,但我正在努力做到'正确',干净利落的设计并没有黑客攻击。

我有两个类GamePanel接收点击和按键,Model包含所有实体,并负责更新。模型需要知道用户鼠标的位置,但我无法决定采用“正确”的方法。

ModelEntity内的GamePanel是否应保留对GamePanel的引用,或者只是缓存最后一个已知鼠标位置并定期从GamePanel接收更新。使用创建模型时的第一个选项,需要为World.update()提供引用,第二个鼠标位置的第二个选项将作为参数发送到{{1}}方法。

这些解决方案似乎都不优雅,所以我想知道是否有一种'正确'的方式来做到这一点,我错过了。

谢谢, 本。

5 个答案:

答案 0 :(得分:3)

在我看来,这取决于你的课程如何互动。鼠标位置的变化是否触发了Model类中的实体?或者Model类是否独立于GamePanel并且仅适用于Mouse位置的当前值?

如果后来和那个案子我同意杰夫在我面前所说的话。在创建它时将GamePanel上的句柄传递给Model类,并让每个实体在需要时使用句柄来访问鼠标位置。这样就可以使用更新的鼠标位置。

如果前者我建议使用Observers让Model类知道鼠标位置值何时发生变化。然后Model类可以使用相同的设计(即让Model类总是在GamePanel类上有句柄)并访问GamePanel中的当前值。

总结我对你的问题的回答,我认为只有符合逻辑且符合OO概念才能让GamePanel保持鼠标位置的值,让其他类使用GamePanel实例访问该信息。

谢谢, 罗汉。

答案 1 :(得分:3)

常见的解决方案是触发事件。在这种情况下,GamePanel将触发一个事件,通知新鼠标位置模型中所有感兴趣的(订阅事件)对象(实体)。

通过这种方式,GamePanel不需要明确知道要通知哪些实体,并且实体不需要保留GamePanel的实例。

我的建议:阅读事件监听器。 (java.util中)

答案 2 :(得分:2)

您可以始终将当前坐标设置为GamePanel的公共属性,以便实体/模型可以从那里简单地访问它。

答案 3 :(得分:1)

如果要轮询当前鼠标位置,可以随时在事件发送线程中运行此代码snipplet:

Point pt = MouseInfo.getPointerInfo().getLocation();
Point cpt = GamePanel.getLocationOnScreen();
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y);

rel 包含鼠标的相对位置。

或者,您可以查看JInput,因为它旨在应对键盘/鼠标/任何输入。

答案 4 :(得分:1)

模型是否总是需要知道鼠标的位置。 IE:您是否需要在每次更新时使用鼠标位置,或仅在特定点处使用鼠标位置。

如果您在每个点或每次更新时都需要它,那么您已记录的解决方案或此处的任何解决方案都应该是可靠的。

如果您只在特定点需要它,那么只需抓住它。 (IE:如果您的游戏响应鼠标点击,则点击一下。)含义阅读事件监听器。

祝你好运!希望有所帮助。