我正在用 Cocos2D-x 编写一个游戏,但我感觉我的 OO 很马虎。我无法摆脱这种感觉,我可以指出原因。
游戏场景类
图层类
- 负责创建自己
- 还会在需要时调用 HUD
- 包含层上对象的 std::vectors
项目等级
- 把握自己的一切
- 有一个 Sprite 成员变量在图层上
HUD1
- 当用户点击图层并且触摸发生在对象中时调用
- 是您可以对对象执行的操作的菜单
- 当您单击菜单项时,它需要更改对象中的值
- 当您单击菜单项时,它实际上运行对象中的代码 (object::doSomething())
感觉马虎的地方我觉得是这些类在一起有很多依赖。
我觉得我应该将其抽象出来并创建一个类来控制所有这一切的发生,而不是对象、图层、HUD 等中的一些代码。
谁能告诉我这是如何布局的以及我是否犯了 OO 错误?
事实证明,图形和游戏并不适合 OO 设计,尽管在许多 OO 文本中都是示例。关于将控制与数据分离,您的直觉是正确的。如今,一种流行的游戏设计模式是拥有组件、实体和系统,而不是严格的 OO 层次结构。
我们的想法是,您拥有的实体或游戏对象只是组件的集合,或许还有一些消息传递基础设施。组件存储有关它们所附加的实体的数据,例如,您可能有一个变换组件和一个速度组件。现在,一种方法是拥有一个消息系统,组件可以挂接到该系统并使用它来更新它们的数据。例如,Velocity 组件可能 Hook 到 Update 消息中,并且在 Update 处理程序中它可以获得对象的转换并移动它。通过将消息用于组件之间的所有通信,您可以在很大程度上解耦它们。
系统是处理更新组件数据的不同方式。 Systems 的想法是,您有一个流程可以说“我对具有这些组件的实体进行操作”,然后它在运行时获得所有相关实体的列表。这进一步将数据与功能分离,并且可以更轻松地管理线程和依赖项
从本质上讲,面向对象的设计是关于捕捉现实世界中的“事物是什么”,但对于一款游戏,您并不是真的想要那样,您所关心的只是事物的外观以及您希望能够改变没有痛苦的事物行为的各个方面。
实体组件系统的良好资源:
http://piemaster.net/2011/07/entity-component-primer/
http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/