类似于"马里奥"的2D侧卷轴游戏中的碰撞反应

Rob*_*Rob 11 2d collision-detection game-engine

这在过去的几周里一直困扰着我.在这段时间里,我一直在网上进行研究,甚至在Borders的计算机部分读书,试图找到答案,但我没有太多运气.

我为侧卷轴视频游戏编写了2D级编辑器.现在我想把它变成一个游戏,我有一个可以跑步和跳跃探索关卡的玩家,类似于"马里奥".

真正给我带来麻烦的是碰撞响应(不是检测:我已经知道如何判断两个块是否发生碰撞).以下是我将要说明的一些场景,以便您可以看到我的问题(阴影块是地面,箭头是玩家的速度矢量,虚线是玩家的投影路径).

查看此碰撞响应方案图像:

例 http://dl.dropbox.com/u/12556943/collision_detection.jpg

假设情景(1)和(2)中的速度矢量相等(相同的方向和幅度).然而,在场景(1)中,玩家正在击中该区块的一侧,并且在场景(2)中,该玩家落在该区块的顶部.这使我得出结论,确定碰撞响应不仅取决于玩家的速度矢量,还取决于玩家相对于碰撞块的相对位置.这引出了我的第一个问题:知道速度矢量和玩家的相对位置,我如何确定玩家与该块碰撞的方向(左侧,右侧,顶部或底部)?

我遇到的另一个问题是如果玩家与同一帧中的多个块发生碰撞,如何确定碰撞响应.例如,假设在场景(3)中,玩家同时与这两个块碰撞.我假设我将不得不遍历玩家正在碰撞的每个区块并相应地调整每个区块的反应.总结一下,这是我的第二个问题:如果玩家与多个块碰撞,我该如何处理碰撞响应?

请注意,我从未透露过我正在编程的语言; 这是因为我更喜欢你不知道(不过是个人的,但是:).我对伪代码比对特定语言代码更感兴趣.

谢谢!

cha*_*ian 11

我认为XNA的示例平台游戏处理冲突的方式可能对您有用.我在Stack Overflow上的其他地方发布了一个非常类似的问题的答案,但也会在这里转发它.

  1. 之后将移动,检查并解决冲突.
  2. 根据玩家的边界框确定玩家重叠的图块.
  3. 迭代所有这些瓷砖执行以下操作:(除非您的播放器与您的世界瓷砖相比,它通常不是很多)
    1. 如果要检查的磁贴不可通过:
      1. 确定玩家与不可通过的图块重叠的X轴和Y轴的距离
      2. 通过仅在浅轴(无论哪个轴穿透最少) 将玩家移出该图块来解决碰撞
        • 例如,如果Y是浅轴并且碰撞在下方,则将玩家向上移动到不再与该图块重叠.
        • 像这样的东西: if(abs(overlap.y) < abs(overlap.x)) { position.y += overlap.y; } else { position.x += overlap.x; }
      3. 根据玩家的新位置更新边界框的位置
      4. 转到下一个瓷砖......
    2. 如果正在检查磁贴可通过的,则不执行任何操作
  4. 如果解决碰撞可能会将玩家移动到另一个碰撞中,您可能希望再次运行上述算法.或重新设计你的水平.

这种逻辑的XNA版本是player.csHandleCollisions()如果你有兴趣在抢夺他们的代码,看看他们具体做有功能.