Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 块在矩形c和x2B之间移动+;(完)_C++_Collision - Fatal编程技术网

C++ 块在矩形c和x2B之间移动+;(完)

C++ 块在矩形c和x2B之间移动+;(完),c++,collision,C++,Collision,我有两个矩形,其中一个是静止的。每当我试图将一个移动到另一个时,我希望它“滑动”,而不是被卡住而无法移动。我使用定向边界框,代码经过了相当的测试,但我不知道如何避免它们被卡住 目前我所做的是: o1=o; 矢量2DF vxy=o.V; o1.Pos+=vxy; if(o1.重叠(o2)){ o1=o; o1+=vector2df(0.f,vxy.y); if(o1.重叠(o2)){ vxy.y=0; } o1=o; o1+=vector2df(vxy.x,0.f); if(o1.重叠(o2))

我有两个矩形,其中一个是静止的。每当我试图将一个移动到另一个时,我希望它“滑动”,而不是被卡住而无法移动。我使用定向边界框,代码经过了相当的测试,但我不知道如何避免它们被卡住

目前我所做的是:

o1=o;
矢量2DF vxy=o.V;
o1.Pos+=vxy;
if(o1.重叠(o2)){
o1=o;
o1+=vector2df(0.f,vxy.y);
if(o1.重叠(o2)){
vxy.y=0;
}
o1=o;
o1+=vector2df(vxy.x,0.f);
if(o1.重叠(o2)){
vxy.x=0;
}
}
o1.V=vxy
这是相当“脏”的,因为它只是检查是否可以在X和Y方向进行移动,如果单独碰撞,则禁用它

速度是一个浮点数,所以稍后它将只添加它


我曾想做一个while循环,直到它不发生碰撞,留下较小的值,它不会发生碰撞,但它要么不工作,要么陷入无限循环…

我猜首先要做的是倒带移动框的运动,这样它就不会再与固定框发生碰撞。现在你的盒子可能处于碰撞状态,因此无限循环

然后,对于确定移动长方体的新速度,您可能希望从移动长方体碰撞的固定长方体获取边的方向,并将其设置为新速度

在某个时刻,你可能还想将这个新的速度乘以你的初始速度和新的方向,这样当移动的盒子垂直于固定盒子的边缘时,它基本上停止了,但是如果它以一个锐角移动,它不会失去太多的速度

所有这些都描述了一种过于简单的方法,如果您想要更清晰的结果,您可能需要阅读更多关于基本游戏引擎/物理/碰撞检测的内容


希望这能有所帮助。

当3次或更多碰撞同时发生时,它会变得更加有趣。您至少需要碰撞前的前一个位置,以及碰撞的精确位置的解算(以便您可以沿碰撞框平滑移动,而不是后退到前一个位置导致的楼梯台阶凹凸。)