2

1.我想知道以下结构是否不正确,原因是什么,解决方法是什么:假设我已经实现了一个网络游戏客户端客户端有2个主要包:
A.GUI - 保存所有swing Jpanels 等
B.LogicEngine

在逻辑引擎中,我有一个名为 clientThread 的类,其主要目标是与服务器通信以获取要在 Gui 面板上执行的命令,并根据用户在 Gui 面板上的选择发送回信息。

2.为了做到这一点,我倾向于在clientThread中保留我的主Gui面板的引用,反之亦然,在两个不同项目的类之间进行循环引用有那么错误吗?

3.在面向对象编程的问题上,从类中执行要在 Gui 上显示的内容是否是错误的,例如客户端线程,尽管它在逻辑引擎包上,但它以某种方式负责管理游戏流程?

4.如果 Gui 部分知道并使用逻辑部分是否有问题?

想听听一些建议
非常感谢

4

2 回答 2

8

显然,GUI 应该依赖于引擎,而不是相反(而且,上帝保佑,它们不应该相互依赖)。

您的问题实际上很常见且易于解决。引擎线程应该允许客户端代码安装一个监听器,每次发生事情时都会收到通知。比 GUI 实现该侦听器并安装它。请注意,游戏逻辑引擎只知道侦听器接口,而不是位于您的 GUUI 包中的特定实现。

这是观察者模式的一个实现,它有几个优点:

  • 通知代码(逻辑)不与“感兴趣的”代码(GUI)耦合,引擎与 GUI 之间没有依赖关系
  • 您可以插入任何侦听器/观察器的实现,例如将 Swing 应用程序更改为控制台/移动/Web 应用程序,而无需对引擎进行任何更改。
  • 您可以有多个监听器,例如一个用于更新 GUI,第二个用于运行声音等。

最后,从逻辑线程操作 GUI 没有任何问题,但是您必须注意事件调度线程

于 2011-09-27T21:56:13.980 回答
5
  1. 我将添加第三个元素。我将拥有 GUI、LogicEngine 和通信包。通过这种方式,您可以使用文件、本地数据库或模拟类进行测试。逻辑和套接字不属于一起。它们只是彼此的输入和输出。
  2. 我个人会让逻辑对 GUI 一无所知。GUI 的工作只是为了调用逻辑而存在。GUI 不知道是谁或什么在调用它,它也不在乎。这与微波炉不在乎我使用它还是我的妻子的原因相同。
  3. 我不太明白这个问题。你能改写一下吗?
  4. 不,反过来就是问题所在。GUI 存在,因此用户可以操纵逻辑。当逻辑依赖于 GUI 时,就会发生不好的事情。
于 2011-09-27T21:56:36.977 回答