我被教导不要将大多数方法放在一般的 "System" class 中,但它们会去哪里呢?
I've been taught not to place most methods in a general "System" class but where do they go instead?
我正在制作游戏。将几乎所有游戏逻辑放在 Game
class 中似乎是最自然的,让它创建所有对象并在其中主要包含 getter 和 setter 方法。这真的错了吗?我是否应该尝试将某些游戏逻辑强加到其他 class 中,例如 Player
轮到他的过程作为 Player
的方法?
在一个典型的游戏中,如果玩家射击是由鼠标点击触发的,你会如何从点击事件到更新屏幕状态再到销毁目标对象的方法和对象互相打电话?
我是否应该摆脱 Game
class 并以某种方式让其他对象相互调用?
这个项目要多长时间?如果您计划一个长期项目,您很有可能最终会想要放弃您的手写代码 UI,转而与一个大型 Java 游戏图形引擎集成。
如果这个假设成立,您可能希望使用 Model View Presenter pattern,以便更轻松地移植您的图形库,以及 MVP 的其他好处(模块化、可测试性、跨越高楼、等等)
所以,如果你沿着这条路走下去,你会
- GameModel:游戏中使用的数据。
- May/May 没有 Player 等 类 随行。
- 给save/load/track玩家的代码应该在这一层。
- GamePresenter,其中包含您所有的 UI 逻辑
- 它知道 GameModel 和关联的 类。
- 它可以将事件传递给 GameView,使用事件处理程序或定义 IGameView 接口。然而,它可能不知道真正的 GameView 是如何实现的任何细节。
- 游戏视图
- 它知道所有关于 GamePresenter 和 GameModel 的信息。
- 它应该只包含实际显示您的游戏并从用户那里获取输入所需的代码。
您描述问题的方式表明您正在使用本应属于其他对象的逻辑重载 class Game
。
第一个信号出现在你说其他对象时"have mostly getters and setters"。这意味着这些对象只是保持状态但缺乏有趣行为的数据结构。这表明您仍然需要更深入地思考如何在对象之间分配职责。
第二个证据在你问题的第二段。它表明模型和 GUI 之间的分离不佳。验证是否存在足够分离(或不分离)的一个很好的测试是证明您可以从脚本播放 Game
(至少它的重要部分),即,无需执行任何 GUI 代码。游戏模型只有在 "headless" 模式下功能齐全才能被正确设计。
最后,摆脱 Game
class 将是一个错误的决定,因为您的模型不会对您尝试的 "reality" 中存在的实体有任何表示型号。
我认为您描述的以 Game
为中心的设计反映了您看待领域的方式。如果您只看到 "the game",那么您将仅以此为模型。然而,游戏通常是丰富的模拟,充满了有趣的对象,这些对象的行为远远超出了与玩家的互动。因此,我建议更多地考虑其他对象,他们知道什么,他们可以执行什么任务,他们将如何与他人合作等等。换句话说,不要对游戏进行编程,对它的参与者、元素、规则、阶段进行编程,策略,人物等。也不要小看任何实体;所有这些都有一些有趣的东西可以添加到整体中,即使是棋盘上的单个棋子也可以为您正在创建的小宇宙做出贡献。不是其他任何人都可以提供的东西,没有其他对象可以提供代码经济和优雅的东西。
我正在制作游戏。将几乎所有游戏逻辑放在 Game
class 中似乎是最自然的,让它创建所有对象并在其中主要包含 getter 和 setter 方法。这真的错了吗?我是否应该尝试将某些游戏逻辑强加到其他 class 中,例如 Player
轮到他的过程作为 Player
的方法?
在一个典型的游戏中,如果玩家射击是由鼠标点击触发的,你会如何从点击事件到更新屏幕状态再到销毁目标对象的方法和对象互相打电话?
我是否应该摆脱 Game
class 并以某种方式让其他对象相互调用?
这个项目要多长时间?如果您计划一个长期项目,您很有可能最终会想要放弃您的手写代码 UI,转而与一个大型 Java 游戏图形引擎集成。
如果这个假设成立,您可能希望使用 Model View Presenter pattern,以便更轻松地移植您的图形库,以及 MVP 的其他好处(模块化、可测试性、跨越高楼、等等)
所以,如果你沿着这条路走下去,你会
- GameModel:游戏中使用的数据。
- May/May 没有 Player 等 类 随行。
- 给save/load/track玩家的代码应该在这一层。
- GamePresenter,其中包含您所有的 UI 逻辑
- 它知道 GameModel 和关联的 类。
- 它可以将事件传递给 GameView,使用事件处理程序或定义 IGameView 接口。然而,它可能不知道真正的 GameView 是如何实现的任何细节。
- 游戏视图
- 它知道所有关于 GamePresenter 和 GameModel 的信息。
- 它应该只包含实际显示您的游戏并从用户那里获取输入所需的代码。
您描述问题的方式表明您正在使用本应属于其他对象的逻辑重载 class Game
。
第一个信号出现在你说其他对象时"have mostly getters and setters"。这意味着这些对象只是保持状态但缺乏有趣行为的数据结构。这表明您仍然需要更深入地思考如何在对象之间分配职责。
第二个证据在你问题的第二段。它表明模型和 GUI 之间的分离不佳。验证是否存在足够分离(或不分离)的一个很好的测试是证明您可以从脚本播放 Game
(至少它的重要部分),即,无需执行任何 GUI 代码。游戏模型只有在 "headless" 模式下功能齐全才能被正确设计。
最后,摆脱 Game
class 将是一个错误的决定,因为您的模型不会对您尝试的 "reality" 中存在的实体有任何表示型号。
我认为您描述的以 Game
为中心的设计反映了您看待领域的方式。如果您只看到 "the game",那么您将仅以此为模型。然而,游戏通常是丰富的模拟,充满了有趣的对象,这些对象的行为远远超出了与玩家的互动。因此,我建议更多地考虑其他对象,他们知道什么,他们可以执行什么任务,他们将如何与他人合作等等。换句话说,不要对游戏进行编程,对它的参与者、元素、规则、阶段进行编程,策略,人物等。也不要小看任何实体;所有这些都有一些有趣的东西可以添加到整体中,即使是棋盘上的单个棋子也可以为您正在创建的小宇宙做出贡献。不是其他任何人都可以提供的东西,没有其他对象可以提供代码经济和优雅的东西。