以OO方式进行游戏设计

Ada*_*ski 21 java oop java-2d

我正在设计一个简单的游戏,它使用Java 2D和牛顿物理.目前我的主要"游戏循环"看起来像:

do {
  for (GameEntity entity : entities) {
    entity.update(gameContext);
  }

  for (Drawable drawable : drawables) {
    drawable.draw(graphics2d);
  }
} while (gameRunning);
Run Code Online (Sandbox Code Playgroud)

当指示实体自我更新时,它将根据施加于其上的当前力来调整其速度和位置.但是,我需要实体展示其他行为; 例如,如果玩家射杀了"坏人",则该实体应该被摧毁并从游戏世界中移除.

我的问题:以面向对象的方式实现这一目标的最佳方法是什么?到目前为止,我所见过的所有例子都将游戏循环合并到一个称为类似的神类中Game,执行步骤:检测碰撞,检查是否坏人杀死,检查是否被玩家杀死,重新绘制等等.封装了所有游戏状态(剩下的生命等).换句话说,它是非常程序化的,所有逻辑都在Game类中.有谁能推荐更好的方法?

以下是我到目前为止所考虑的选项:

  • GameContext如果需要,将a传递给实体可以从中移除的每个实体,或更新游戏状态(例如,如果玩家被杀,则"不运行").
  • 将每个人注册GameEntity为中央Game班级的听众,并采取面向事件的方法; 例如,碰撞会导致CollisionEvent向碰撞中的两个参与者发射.

Eva*_*ers 14

我与两个商业游戏引擎密切合作,他们遵循类似的模式:

  • 对象代表游戏实体的组件或方面(如物理,可渲染,无论如何),而不是整个实体.对于每种类型的组件,都有一个巨大的组件列表,每个组件对应一个组件.

  • "游戏实体"类型本身只是一个唯一的ID.每个巨大的组件列表都有一个映射,用于查找与实体ID对应的组件(如果存在).

  • 如果组件需要更新,则由服务或系统对象调用.每个服务都直接从游戏循环更新.或者,您可以从调度程序对象调用服务,该对象从依赖关系图确定更新顺序.

以下是此方法的优点:

  • 您可以自由组合功能,而无需为每个组合编写新类或使用复杂的继承树.

  • 几乎没有任何功能可以假设您可以放入游戏实体基类中的所有游戏实体(光与赛车或天空盒有什么共同之处?)

  • ID到组件的查找可能看起来很昂贵,但是服务通过迭代特定类型的所有组件来完成大部分密集工作.在这些情况下,最好将所需的所有数据存储在一个整洁的列表中.


pli*_*nth 6

在我工作的一个特定引擎中,我们将逻辑与图形表示分离,然后有对象发送消息以实现他们想要做的事情.我们这样做是为了让我们可以将游戏存在于本地机器上或联网,并且从代码角度来看它们彼此无法区分.(命令模式)

我们还在一个可以即时更改的单独对象中完成了实际的物理建模.这让我们很容易搞砸重力等.

我们大量使用事件驱动代码(监听器模式)和大量定时器.

例如,我们有一个可以交叉的对象的基类,可以监听碰撞事件.我们将其分为健康箱.在碰撞时,如果它被玩家实体击中,它会向碰撞器发送一个命令,它应该获得健康,发送消息向所有可以听到它的人广播声音,停用碰撞,激活动画以从中删除图形场景图,并设置一个计时器以便以后重新实例化.这听起来很复杂,但事实并非如此.

如果我记得(已经12年了),我们就有了抽象的场景概念,所以游戏就是一系列场景.当一个场景结束时,会触发一个事件,该事件通常会发送命令,取消当前场景并启动另一个场景.