c++ - 矩形c ++之间的块移动(碰撞完成)
问题描述
我有两个矩形,其中一个是静止的。每当我尝试将一个移向另一个时,我希望它“滑动”而不是卡住而无法移动。我使用定向边界框并且代码经过了相当的测试,但我不知道如何避免它们卡住。
目前我做的是这样的:
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循环,直到它不碰撞,留下它不会碰撞的较小值,但它要么不起作用,要么陷入无限循环......
解决方案
我猜要做的第一件事就是倒带移动框的运动,使其不再与固定框发生碰撞。现在你的盒子可能处于碰撞状态,因此是无限循环。
然后,至于确定移动框的新速度,您可能希望从移动框碰撞的固定框获取边缘的方向并将其设置为新速度。
您可能还想在某个时候将这个新速度乘以您的初始速度和新方向的点积,这样当移动框垂直于固定框的边缘时,它基本上会停止,但如果它的速度非常快角度它不会失去太多的速度。
所有这些都描述了一种过于简单的方法,如果您想要更清晰的结果,您可能需要阅读更多关于基本游戏引擎/物理/碰撞检测的信息。
希望这可以帮助。
推荐阅读
- sql - 如何在 SQL 选择查询中创建两个“where”条件
- angular - 从 Angular 7 中的 Observable 获取数据
- javascript - 如何使用处理程序动态添加下拉选择值?
- robotics - 任务计划实际上意味着什么?
- javascript - 数字字体大小由小变大
- python - 如何在不使用搅拌机的 bpy 的情况下创建一个用 Python 连接两个点的圆柱体?
- reactjs - react-native-web 如何使用 react-native 导入?
- post - Shopify API HTTP POST 重定向而不是 POST
- css - 使用 Flexbox 和 Material UI 使 Item 位于底部
- google-apps-script - 可以在 Google Script WebApp 的 HTML 端使用 If/Else 语句吗?