我一直试图解决这个问题几个小时,互联网在这个问题上非常没有用。
我需要帮助检测和解决矩形之间的碰撞,而不是只是检测,但请注意我也提到了解决方法。
这是两个盒子,x / y宽度/高度。我只需要检测它们何时重叠,并将其中一个盒子顺利地推出另一个盒子。
另外,请注意,一个盒子是静止的 - 另一个盒子正在移动。
有没有人对此有所了解(或者可以举个例子?)我真的很感激。
我需要这些盒子能够彼此重叠。
谢谢!
答案 0 :(得分:2)
我不确定这里的背景是什么(这些盒子是移动还是静止?你在寻找物理上准确的分辨率,还是只是几何上正确的分辨率?),但似乎你可以在下面完成这个方式:
1)确定是否存在箱子碰撞 2)确定两个盒子的交叉点,这将产生第三个盒子。盒子的宽度和高度是你的穿透深度。 3)将其中一个方框的中心移动到穿透深度(x - 宽度,y - 高度)。
这会导致盒子变得不相交。
仅供参考:两个方框的交点可以通过从两个方框中获取分钟的最大值和最大值来计算。
以下是我的引擎中用于盒子交叉的一些代码:
bool Bounds::IntersectsBounds(const Bounds &other) const
{
return !(min.x > other.max.x || max.x < other.min.x
|| min.y > other.max.y || max.y < other.min.y);
}
bool Bounds::Intersection(const Bounds &other, Bounds &outBounds) const
{
if (!this->IntersectsBounds(other)) {
return false;
}
outBounds.min.x = std::max(min.x, other.min.x);
outBounds.min.y = std::max(min.y, other.min.y);
outBounds.max.x = std::min(max.x, other.max.x);
outBounds.max.y = std::min(max.y, other.max.y);
return true;
}
在这种情况下,“outBounds”变量是两个框的交集(在这种情况下是您的穿透深度)。您可以使用此框的宽度/高度来执行碰撞解决。
答案 1 :(得分:0)
呀!这是一个非常常见的问题!您可能想查看堆栈交换网络的gamedev部分!
<强>检测强>
bool collide(float x1,float y1,float sx1,float sy1, float x2, float y2, float sx2, float sy2){
if (x1+sx1 <= x2)
return false;
if (x2+sx2 <= x1)
return false;
if (y1+sy1 <= y2)
return false;
if (y2+sy2 <= y1)
return false;
return true;
}
解决强> 至于答案,这取决于您要使用的应用程序类型。它是一个侧面滚动器,自上而下,基于瓷砖?答案取决于对这个问题的回答。我会假设一些像动态游戏或自上而下动作游戏那样充满活力的东西。
代码并不难,但实现可以。如果您在屏幕上移动的对象很少,则可以使用类似的系统进行挖掘,如下所示:
A
)的上一个底部位置是否高于相关对象的顶部(B
),如果是这样则表示您发生了底部碰撞。通过将A
的y位置设置为B
的y位置减去A
A
的前一个右侧是否在B
左侧的左侧,如果是这样意味着您已经拥有右侧碰撞。通过将A
的x位置设置为B
的位置减去A
的宽度A
的左侧是否在B
右侧的右侧,如果是这样意味着您已经拥有左侧碰撞。通过将A
的x位置设置为B
的x位置加上B
的宽度A
的上一个上方是否低于B
的下方,如果是,则表示您发生了上方碰撞。通过将A
的y位置设置为B
的y位置以及B
的高度来解决呼。重要的是你要根据距离对对象进行排序,如果你检查与更远的物体的碰撞,它会抓住边缘!
我希望这是有道理的!
答案 2 :(得分:0)
编辑:显然在Android中不起作用。
https://stackoverflow.com/a/15515114/3492994
使用2D Graphics API中的可用类。
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Line2D l1 = new Line2D.Float(0, 200, 200, 0);
System.out.println("l1.intsects(r1) = " + l1.intersects(r1));
这不告诉你什么,是......