如何有效地实现平台游戏的固体对象?

时间:2011-10-01 15:41:23

标签: algorithm implementation

我一直试图写几次平台引擎。问题是我对实体对象的实现细节不太满意。 (墙,地板,天花板)我有几个我想讨论的场景。

对于像第一个马里奥这样的简单平台游戏,一切都是块。一个好的实现应该只检查必要的碰撞,例如,如果马里奥正在运行,并且在路的尽头有悬崖,我们应该如何有效地检查碰撞?我们是否应该始终检查马里奥正在采取的每一步,看看他的撞击箱是否还在地上?或者是否有其他编程方式允许我们不在每一帧处理这个?

但是块很无聊,让我们放在一些斜坡上。实施细节,如何处理斜坡?像Sonic这样的游戏有这种循环结构,角色可以在循环中“哇哇”并继续进行。

另一种情况是“固体”物体(地板,天花板,墙壁)处理。 In Megaman, we can see that the player can make himself go through the ceiling by using a tool to go into the solid "wall".可能,这里的编程是通过快速向右移动玩家来迫使玩家离开墙壁以使玩家不会被卡住。这是一种旧的“解决方法”方法,可以避免玩家陷入困境。在如今的新游戏中,手柄更复杂。举例来说,Super Smash Brawl,玩家可以放大角色(以及他们的命中箱)该程序允许玩家在天花板上“移动”,但是一旦角色离开“固体”区域,他们就不能然而,有时,一个角色是巨大的,他们通过一个场景的3个坚实的楼层,他们仍然可以移动到内部。有人知道这些方面的实施细节吗?

所以在这里,我知道有很多可能的实现,但我想在这里问一下,我应该注意平台游戏的一些高级技术细节吗?我目前要求3件事:

  1. 如何有效处理平台游戏的固体碰撞?我们可以花更少的时间来检查角色是否已经跑完并完全从平台上掉下来了吗?

  2. 坡度编程。起初,我在考虑物理引擎,但我认为它可能有点过分。但是在这里,我看到斜坡几乎是另一种类型的地板,可以将角色“推”或“拉”到不同的高度。或者它应该以不同的方式编程?

  3. 特殊情况下的实体对象处理。可能有一段时间玩家可以通过合法的游戏规则或故障滑入固体物体,但总而言之,如果玩家在墙上,将玩家推向某个随机方向总是一个坏主意。

1 个答案:

答案 0 :(得分:1)

  1. 对于少量对象,在每个时间步进行全对碰撞检测检查是正常的。一旦你获得了超过几百个对象,你可能想要开始考虑一个更有效的方法。一种方法是使用binary space partitioning(BSP)仅检查附近的对象。碰撞检测是一个非常好的研究主题,并且有大量的资源描述了各种优化。
  2. 事实上,物理引擎很可能对此任务有些过分。一般来说,你可以将每个移动角色与他所站立的“地面”联系起来。然后每当他移动时,你只需让他沿着地轴移动。
  3. 滑入物体几乎总是一个坏主意。尽可能避免使用它。