这在过去几周一直困扰着我。这段时间我一直在网上研究,甚至在 Borders 的计算机部分阅读书籍以试图找到答案,但我没有太多运气。
我为横向卷轴视频游戏编写了一个 2D 关卡编辑器。现在我想把它变成一个游戏,我有一个可以跑跳的玩家来探索关卡,类似于“马里奥”。
真正给我带来麻烦的是碰撞响应(不是检测:我已经知道如何判断两个块是否发生碰撞)。下面是我将要说明的一些场景,以便您可以看到我的问题(阴影块是地面,箭头是玩家的速度矢量,虚线是玩家的投影路径)。
请参阅此碰撞响应场景图像:
http://dl.dropbox.com/u/12556943/collision_detection.jpg
假设场景 (1) 和 (2) 中的速度矢量相等(方向和幅度相同)。然而,在场景 (1) 中,玩家正在撞到方块的一侧,而在场景 (2) 中,玩家正在降落在方块的顶部。这让我得出结论,确定碰撞响应不仅取决于玩家的速度矢量,还取决于玩家与碰撞块的相对位置。这引出了我的第一个问题:知道速度向量和玩家的相对位置,我如何确定玩家从哪个方向(左侧、右侧、顶部或底部)与方块相撞?
我遇到的另一个问题是如果玩家与同一帧中的多个块发生碰撞,如何确定碰撞响应。例如,假设在场景 (3) 中,玩家同时与这两个块发生碰撞。我假设我将不得不遍历玩家正在碰撞的每个块,并相应地调整每个块的 react 。总结一下,这是我的第二个问题:如果玩家与多个块发生碰撞,我该如何处理碰撞响应?
请注意,我从未透露我正在编程的语言;这是因为我希望你不知道(虽然不是针对个人的 :] )。我对伪代码更感兴趣,而不是查看特定于语言的代码。
谢谢!
最佳答案
我认为 XNA's example platform game 处理碰撞的方式可能对你有用。我将此答案发布到了一个非常相似的问题 elsewhere on Stack Overflow,但也会在这里转发。
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/