框冲突代码
Box Collision code
我的盒子碰撞代码不起作用。
bool checkCollide(int x, int y, int oWidth, int oHeight, int xTwo, int yTwo, int oTwoWidth, int oTwoHeight)
{
if (xTwo + oTwoWidth < x)
return false; // box 2 is left of box 1
if (x + oWidth < xTwo)
return false; // box 1 is left of box 2
if (xTwo > x + oWidth)
return false; // box 2 is right of box 1
if (x > xTwo + oTwoWidth)
return false; // box 1 is right of box 2
if (yTwo + oTwoHeight < y)
return false; // box 2 is up of box 1
if (y + oHeight < yTwo)
return false; // box 1 is up of box 2
if (yTwo > y + oHeight)
return false; // box 2 is down of box 1
if (y > yTwo + oTwoHeight)
return false; // box 1 is down of box 2
return true;
}
在我的盒子上显然是另一个,但是什么也没发生。由于某种原因,它似乎返回了 false。我正在检查一个"矩形"是否超出另一个"矩形"的范围,以及它是否不返回 true。为什么它不起作用?
这是我的做法(我会提供一个 AABB 对象而不是 torough)
bool checkCollide(int x, int y, int oWidth, int oHeight, int xTwo, int yTwo, int oTwoWidth, int oTwoHeight)
{
// AABB 1
int x1Min = x;
int x1Max = x+oWidth;
int y1Max = y+oHeight;
int y1Min = y;
// AABB 2
int x2Min = xTwo;
int x2Max = xTwo+oTwoWidth;
int y2Max = yTwo+oTwoHeight;
int y2Min = yTwo;
// Collision tests
if( x1Max < x2Min || x1Min > x2Max ) return false;
if( y1Max < y2Min || y1Min > y2Max ) return false;
return true;
}
实际上,您可以直接用值替换 x1Max 等,而不是使用临时变量。我添加了它们以提高可读性。
bool checkCollide(int x, int y, int oWidth, int oHeight, int xTwo, int yTwo, int oTwoWidth, int oTwoHeight)
{
if( x+oWidth < xTwo || x > xTwo+oTwoWidth ) return false;
if( y+oHeight < yTwo || y > yTwo+oTwoHeight ) return false;
return true;
}
请注意,此功能仅适用于 2D 框,但它只需要再增加一条带有 z 轴的测试线即可与 3D 兼容。
----------
现在让我们看看你的代码和一些注释
bool checkCollide(int x, int y, int oWidth, int oHeight, int xTwo, int yTwo, int oTwoWidth, int oTwoHeight)
{
if (xTwo + oTwoWidth < x) //(1) if( x2Max < x1Min )
return false;
if (x + oWidth < xTwo) //(2) if( x1Max < x2Min )
return false;
if (xTwo > x + oWidth) //(3) if( x2Min > x1Max ) ==> if( x1Max < x2Min ) ==> (2)
return false;
if (x > xTwo + oTwoWidth) //(4) if( x1Min > x2Max ) ==> if( x2Max < x1Min ) ==> (1)
return false;
if (yTwo + oTwoHeight < y) //(5) if( y2Max < y1Min )
return false;
if (y + oHeight < yTwo) //(6) if( y1Max < y2Min )
return false;
if (yTwo > y + oHeight) //(7) if( y2Min > y1Max ) ==> if( y1Max < y2Min ) ==> (6)
return false;
if (y > yTwo + oTwoHeight) //(8) if( y1Min > y2Max ) ==> if( y2Max < y1Min ) ==> (5)
return false;
return true;
}
如您所见,不需要一半的测试。考虑到 X 轴,您第一个测试与第四个相同;您的第二个测试与第三个测试相同。
----------
但是,我找不到当框重叠时您的函数不返回 true 的任何原因。它应该有效。
我使用以下值进行了测试
std::cout << checkCollide(5, 5, 2, 2, 0, 0, 3, 3) << std::endl; // false no collision
std::cout << checkCollide(5, 5, 2, 2, 4, 4, 3, 3) << std::endl; // true collision
它返回假,并且如预期的那样为真。
bool checkCollide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
if (y1 + h1 < y2
|| y1 > y2 + h2
|| x1 + w1 < x2
|| x1 > x2 + w2) return false;
return true;
}
相关文章:
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 使用简单的 Indy 服务器代码进行访问冲突
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- Windows MSG 结构与旧项目代码结构 MSG 冲突
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 为什么此代码会导致访问冲突
- VS2010 访问冲突,同时使用 F10 或 F11 单步执行代码
- 导致访问冲突的最短C++代码
- 我的代码中存在死锁/访问冲突,即使我已经相互排除了它
- 汇编程序代码,错误 C2443:操作数大小冲突
- 为什么此代码会引发访问冲突异常
- Arduino:Serial.begin() 与运行直流电机的代码冲突
- c++返回元素在没有代码的行上给出访问冲突
- 我收到void main()和使用命名空间std;之间的冲突;?我正在使用代码块
- 在鼠标钩子代码中调用方法会导致访问冲突
- opengl / glsl / sdl代码中的c++访问冲突
- 在代码的不同部分中获取访问冲突错误
- 访问计算机指针时发生访问冲突(c系统异常代码:c0000005),导致应用程序崩溃
- 变量名为TYPE_BOOL(c++代码)与ios宏冲突