平台与物理
这些边缘情况很多。好玩的平台游戏者并不会以任何一种物理上精确的方式表现,而玩家希望在像Mario这样的“完美”平台游戏者数年之后所获得的控制和行为很难通过Box2D或其他物理引擎等通用技术来实现。大多数优秀的平台游戏玩家在其播放器控制器中均不使用任何通用物理或碰撞响应。
产生船体
关于您的特定问题,最好的解决方案是停止使用盒子作为基础。使用一系列连接的线段(船体)。这使得碰撞检测引擎仅关注实际可行走的表面,而不关注AB和BC之间存在的“伪”边缘。实际上,Box2D就是这样做的。这些形状用于生成向外的表面,将它们链接在一起以形成船体。
即使在基于图块的游戏中,或者在两个AABB对象彼此相邻作为地板的情况下,也需要此设置。碰撞引擎将拾取那些垂直边缘并使玩家抓住它们。有一些可以帮助但不能消除问题的技巧。解决方案是仅使用一个代表曲面的线段,而不是一个完整的2D框。
在一般情况下,您可以通过以下方式生成船体:将多边形相互裁剪,然后将裁剪点连接到边列表中。
倾斜表面
由于您的示例包含一个坡度,并且您提到的是恢复原状和其他物理属性,因此,我将指出您很快就会注意到的其他一些问题,这进一步说明了为什么通用碰撞检测和响应不适用于平台开发人员。首先,尝试站在倾斜的平台上,跳起来,然后着陆。您可能会注意到角色着陆时会“滑动”一点。问题在于您生成的接触法线通常会从倾斜的表面指出。然后,在解决碰撞时,将玩家朝该方向推出。即使角色是直接跌倒的,着陆时他也会被推起并向右偏一点,从而产生滑动。可以通过考虑相对速度来破解它,
您要注意的第二个问题(更难解决)是,当您尝试在斜坡上快速运行时会发生什么。玩家将在坡道上“跳跃”。即使在当今大多数AAA游戏中,这也非常明显。它不仅看起来很傻,而且如果您的游戏要求玩家脚踩在地面上跳跃,那么这将使它难以从斜坡滑下并跳到一半,因为玩家仅在斜坡的一小部分接触斜坡。花费下来的时间。一个更简单的解决方法是在玩家移动时简单地进行一些射线投射,如果玩家没有跳跃并且先前在地面上,则将其位置向下捕捉到最近的表面(如果它非常靠近玩家)。
如果您试图模拟玩家的速度,摩擦力和恢复力,就好像他是一个普通的刚体一样,您可能会发现,在坡道上奔跑时,玩家会飞向空中。除非跌倒/跳下,否则玩家的动作应限制在水平方向。当然,如果您使用的是老龄的平台游戏玩家,您可能会注意到,玩家的水平速度通常在水平表面和倾斜表面之间是恒定的。在上/下坡时也需要考虑到这一点。
您最终还会遇到许多其他奇怪的情况。如果您想做一个好的平台游戏者,那么最好是独立于物理平台实现平台游戏玩家控制器,并对所需的运动和控制行为进行硬编码,而不是依赖于通用物理原理和碰撞响应算法。