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

我为横向卷轴视频游戏编写了一个 2D 关卡编辑器。现在我想把它变成一个游戏,我有一个可以跑跳的玩家来探索关卡,类似于“马里奥”。

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

请参阅此碰撞响应场景图像:

2d - 类似于  "Mario"的 2D 横向卷轴游戏中的碰撞 react-LMLPHP
http://dl.dropbox.com/u/12556943/collision_detection.jpg

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

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

请注意,我从未透露我正在编程的语言;这是因为我希望你不知道(虽然不是针对个人的 :] )。我对伪代码更感兴趣,而不是查看特定于语言的代码。

谢谢!

最佳答案

我认为 XNA's example platform game 处理碰撞的方式可能对你有用。我将此答案发布到了一个非常相似的问题 elsewhere on Stack Overflow,但也会在这里转发。

  • 应用移动后,检查并解决碰撞。
  • 根据玩家的边界框确定玩家重叠的瓷砖。
  • 执行以下操作遍历所有这些图块:(通常不会很多,除非您的玩家与您的世界图块相比很大)
  • 如果被检查的瓷砖不能通过:
  • 确定玩家在 X 轴和 Y 轴上与不可通过瓷砖重叠的距离
  • 通过仅在浅轴(以最少穿透的轴)将玩家移出该瓷砖来解决碰撞
  • 例如,如果 Y 是浅轴并且碰撞在下方,则将玩家向上移动以不再与该图块重叠。
  • 像这样:if(abs(overlap.y) < abs(overlap.x)) { position.y += overlap.y; } else { position.x += overlap.x; }
  • 根据玩家的新位置更新边界框的位置
  • 移动到下一个瓷砖...
  • 如果被检查的瓷砖可以通过,则什么都不做
  • 如果解决碰撞可能会使玩家进入另一个碰撞,您可能需要再次运行上述算法。或者重新设计你的关卡。

  • 此逻辑的 XNA 版本位于 player.cs 函数中的 HandleCollisions() 中,如果您有兴趣获取他们的代码以查看他们在那里具体做什么。

    关于2d - 类似于 "Mario"的 2D 横向卷轴游戏中的碰撞 react ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6673822/

    10-15 06:50