我的箱子碰撞代码不起作用.
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;
}
Run Code Online (Sandbox Code Playgroud)
我的盒子显然已经超过了另一个,但是没有发生任何事情.由于某种原因,它似乎正在返回假.我正在检查一个"矩形"是否超出另一个"矩形",如果它不是返回true.为什么不工作?
Val*_*kea 10
这是我将如何做到这一点(我会提供一个AABB对象而不是低谷)
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;
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可以直接使用值替换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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,此功能仅适用于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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,一半的测试不是必需的.考虑到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
Run Code Online (Sandbox Code Playgroud)
它返回false,并且如预期的那样真实.
| 归档时间: |
|
| 查看次数: |
12229 次 |
| 最近记录: |