2d - 边界框碰撞处理 - 不是检测

标签 2d collision-detection sprite bounding-box

我一周前就开始工作了,但后来我把它弄坏了。我无法让它再次工作。我有一些 2D Sprite ,它们只是矩形。不涉及旋转。我不是在寻找一种方法来检测它们之间的碰撞,我有这种方法,而且有成千上万篇关于它的文章。我找不到关于看到碰撞时该怎么做的任何资源。我想要的只是不允许 Sprite 重叠。没有弹跳或任何东西。他们只是停下来。具体来说,现在我只有一个玩家和他遇到的一些关卡。

这听起来很简单,但事实并非如此。它必须非常精确,否则会发生奇怪的事情。我一整天都在尝试解决这个问题,但结果却参差不齐。有时我的播放器卡在地板上,无法左右移动。当我解决这个问题时,他可以向左或向右穿过街区。

所以我目前的设置是这样想的:尝试将玩家移动到他想去的地方。然后询问 map 他的瓷砖是否与任何东西发生碰撞。如果是这样, map 会显示四个方向中每个方向有多少重叠像素。现在棘手的部分是玩家应该如何应对这些数字。当他在地面上时,与地板有 1 个像素的重叠,以便他知道自己在地面上(否则他会在跌落和着陆之间颤抖,因为没有重叠他认为他下面没有任何东西)。这一像素重叠意味着左右边缘也嵌入地板中,因此他无法移动。

是否有一种好的方法可以为玩家使用一个边界框来解决所有问题?为他的四个边各有一个单独的边界框会更好吗?

最佳答案

与地面重叠的另一种选择是将他的起始位置设置为刚好在地面上;然后总是调用下降例程。

如果他的下一个下落部分会使他与地面瓷砖重叠,请将头像上的字段“在地面上”设置为 true(假设您需要跟踪它以实现跳跃目的),并设置 y 位置头像刚好在地面上。虽然他会不断地“下落”,但在视觉上是难以察觉的。

另一种选择是您提到的,其中有 4 个边界框;要注意的是,您可能不希望 4 个单独的角成为任何盒子的成员;因此,如果头像图像为 16x16px,则将其视为四个边各有 4 个 1x16px 的边界框。这会带来它自己的数学难题,但它会起作用。

就处理碰撞和跳跃而言;我认为可行的一个项目是:将运动分成两个离散的运动部分,一个在 x 轴上的移动和一个在 y 轴上的移动。如果 x 轴上的移动被墙阻挡,则将 x 坐标设置为有效的更远位置(因此,x 应该是导致紧贴墙壁/平台的值)。对 y 轴做类似的事情。此时,您还可以更改处理速度的方式;如果合适,将 x/y 速度分量设置为 0。这可能并不理想,具体取决于您正在寻找的游戏感觉。

关于2d - 边界框碰撞处理 - 不是检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355311/

相关文章:

c# - 两条线段在 c# 或 vb.net 中使用 xna 相交吗?

java - 如何获取线与缓冲图像或矩形碰撞的点?

iphone - OpenGL纹理图集出血

python - 如何在 Python 中沿行合并二维数组

c++ - 二维 vector ( vector 下标超出范围)

用于绘制图形的 C++ 库

image - 在Unity中缩放 Sprite 时如何保持 Sprite 边框大小相同?

javascript - 计算数字字符串是否循环 |六 Angular 网格圆形世界

java - Box2D 中的碰撞检测

C# & XNA - 2D 引擎 - 来自汽车的 Group Sprites