我有两个矩形,其中一个固定。每当我尝试将一个移动到另一个时,我都希望它“滑动”而不是被卡住而无法移动。我使用了定向的边界框,并且代码已经过相当的测试,但是我不知道如何避免它们卡住。
当前我正在做什么:
o1 = o;
vector2df vxy = o.V;
o1.Pos += vxy;
if(o1.overlaps(o2)){
o1 = o;
o1 += vector2df(0.f, vxy.y);
if(o1.overlaps(o2)){
vxy.y = 0;
}
o1 = o;
o1 += vector2df(vxy.x, 0.f);
if(o1.overlaps(o2)){
vxy.x = 0;
}
}
o1.V = vxy
这很“肮脏”,因为它只是检查移动是否可以在X和Y中完成,如果单独碰撞则禁用它。
速度是一个浮点数,因此稍后将其相加。
我曾经考虑过进行一次while循环,直到它不发生碰撞,留下较小的值,使其不会发生碰撞,但是它要么不起作用,要么陷入无限循环中……
我想要做的第一件事就是倒回移动盒的运动,以使其不再与固定盒发生碰撞。现在,您的盒子可能处于碰撞状态,因此无限循环。
然后要确定移动框的新速度,您可能希望从移动框与之碰撞的固定框中获取边缘的方向,并将其设置为新速度。
[您可能还希望在某个时候将此新速度乘以初始速度的C0和新方向,以便当移动框垂直于固定框的边缘时,它基本上会停止,但是如果移动在一个锐角下,它不会失去太大的速度。
所有这些都描述了一种过于简化的方法,如果您希望获得更简洁的结果,则可能需要阅读有关基本游戏引擎/物理/碰撞检测的更多信息。
希望这会有所帮助。