2D碰撞检测解决方案

3

我一直在使用一篇文章中的教程编写碰撞检测系统,但是我无论如何都不能让它完美地运行起来。以下是代码:

BoundingBox aBox;
aBox.Convert(a);
BoundingBox bBox;
bBox.Convert(b);

Vector2 aMin = aBox.GetTopLeft();
Vector2 aMax = aBox.GetBotRight();
Vector2 bMin = bBox.GetTopLeft();
Vector2 bMax = bBox.GetBotRight();

Vector2 minDistance;

float left = (bMin.x - aMax.x);
float right = (bMax.x - aMin.x);
float top = (bMin.y - aMax.y);
float bottom = (bMax.y - aMin.y);

// Check for intersection internally
if (left > 0 || right < 0) return;
if (top > 0 || bottom < 0) return;

// Find the minDistance
if (abs(left) < right)
    minDistance.x = left;
else
    minDistance.x = right;

if (abs(top) < bottom)
    minDistance.y = top;
else
    minDistance.y = bottom;

// Null axis with biggest value
if (abs(minDistance.x) < abs(minDistance.y))
    minDistance.y = 0;
else
    minDistance.x = 0;

目前的问题是,角色在走路并抱着一个块的顶部和底部时没问题,但一旦他必须向上走两个块,他就会被卡在它们之间。巧合的是,向下走完全没有问题。只是想知道是否有人有解决这个问题的方法,非常感谢!
以下是更好地展示问题的GIF:
1个回答

0

嗯,这可能更像是一个解决方法而不是实际的修复,但在处理输入时,您可以检查您移动的方向是否有空间。

如果您向左上方移动,可以检查左侧是否有空间,如果没有,则仅应用垂直移动组件。四个方向都适用。

大多数此类错误来自于舍入数字的工作方式,如果您想要一致且良好的行为,则需要解决如何避免这些舍入数字情况,就像我刚才给您的示例一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接