Answers:
我的解决方案是将游戏地图中的每个物理实体都视为树节点,并将地图本身视为根节点。节点可以包含其他节点。每个节点都(直接或间接)包含在地图节点内。
例如,假设您的角色站在平台上。平台的节点包含角色的节点。因此,只要平台移动,它包含的节点(在本例中为角色)也将移动。
为此,每个节点都应相对于父节点具有(x,y)位置。例如,您的角色可以相对于平台位于(1,0),而平台本身可以相对于游戏地图位于(10,10)。这样,如果平台移动,您的角色将隐式移动。
在此分层树中,每个节点的位置等于其位置加上其父节点的位置之和。假设我们要获取角色在地图上的位置。我们计算:
(字符位置)+(父节点位置)+(根节点位置)=(1,0)+(10,10)+(0,0)= (11,0)
好的,所以一直以来,您的角色一直站在平台上。跳什么呢?好吧,他跳的那一刻,您将他从平台上分离开,并将其附加到包含平台的节点上;在这种情况下,为地图(根节点)。
当他再次降落时,将他附加到他降落的任何节点上。
我建议将其视为伪物理问题,并通过使用地面摩擦来解决。
您已经在使用重力将角色保持在地面上,这可以处理平台上下移动的情况。为了处理左右移动,地面应该在角色上施加很大的摩擦。通常,此摩擦级别将为1.0或100%。
如果角色静止不动,则其速度为0,由于摩擦,它们继承了平台速度的100%。类似于以下内容:
character_velocity = friction * platform_velocity
这种方法的好处在于,它很容易适用于其他平台化机制,例如能够克服陡坡上的摩擦力,从而使角色能够滑动。它还使您可以轻松减少摩擦,以创建角色可在其上滑动的冰块。
处理壁挂高度低等问题可能会更容易处理,因为这些问题可能会使播放机脱离移动的平台。如果仅将角色视为父平台的孩子,那么很有可能它会在无需大量工作的情况下与其余碰撞检测非常轻松地交互。