我的 object::collides(object * o) 函数总是 returns true,但什么都不做
my object::collides(object * o) function always returns true, but doesn't do anything
我有一个 return 是布尔值的函数。这个函数在编译时似乎什么都不包含,并且总是 return true 同时也会跳过我放入其中的所有对 cout 或 cin 的调用。看看它实际上在做什么。这是怎么回事,我该如何解决这个问题。
在我的故障排除过程中,我有,
- 在 object::collides 处使用带有断点的 GDB,这导致函数被调用但未向控制台输出任何内容
- 对我的对象进行编号,并将程序认为发生碰撞的对象与正在发生碰撞的对象进行比较。如果它通过了邻近测试,程序认为对象正在碰撞,证明它总是 returning true。
- 尝试了各种其他方法试图弄清楚发生了什么,但都没有答案
在object.cpp中:
bool object::collides(object * other)
{
std::vector<point> a_pnt = getBounds();
std::vector<point> b_pnt = other->getBounds();
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
point v1 = a_pnt[i];
point v2 = a_pnt[(i+1)%a_pnt.size()];
point v3 = b_pnt[j];
//edit: fixed typo
point v4 = b_pnt[(j+1)%b_pnt.size()];
double num_1 = ((v3.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v3.y - v1.y));
double num_2 = ((v2.x - v1.x) * (v3.y - v1.y)) - ((v3.x - v1.x) * (v2.y - v1.y));
double den =((v2.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v2.y - v1.y));
double frac_1 = num_1 / den;
double frac_2 = num_2 / den;
//debug code start
std::cout << num_1 << "/" << den << "=" << frac_1 << std::endl;
std::cout << num_2 << "/" << den << "=" << frac_2 << std::endl;
std::cout << (frac_1 > 0.0) << " " << (frac_1 < 1.0) << " " << (frac_2 > 0.0) << " " << (frac_2 < 1.0) << std::endl;
std::cout << std::endl;
std::string hahah;
std::cin >> hahah;
//end debug code
//edit: fixed conditional
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0));
return true;
}
}
//edit: fixed conditional
return false;
}
在 mode.cpp 在函数 mode::step()
:
for (int i = 0; i<onScreen.size(); i++)
{
object * o1 = onScreen[i];
for(int j = i+1; j<onScreen.size(); j++)
{
object * o2 = onScreen[j];
if(o1->getVectorLength(o2)<50){
std::cout << "Checking collisions for objects " << i << " and " << j << std::endl;
if(o1->collides(o2))
{
std::cout << "somthing collided\n";
}
}
}
}
输出:
Checking for Collisions
Checking collisions for objects 0 and 11
somthing collided
Checking collisions for objects 1 and 8
somthing collided
Checking collisions for objects 1 and 18
somthing collided
Checking collisions for objects 1 and 26
somthing collided
预期结果是 "collides" 函数输出到屏幕或请求输入该字符串,这将表明它实际上正在正确地执行该部分代码。但是它不会这样做。 "collides" 函数 return 为真,无论实际相交部分是真还是假,同时跳过我所有的调试代码,如输出所示。
编辑:
- 修复了碰撞中的 return
- 修正了一个错字
- 还是不行。
确实会使用 bullet/bullet 组合而不是 bullet/asteroid 或 asteroid/asteroid
进行思考循环
检查 getBounds 让我摸不着头脑……
std::vector asteroid::getBounds()
{
//我的问题在这里,更仔细地检查你的功能:P
//不是 returning 一个包含任何内容的向量。
std::vector t;
//现在是
std::vector t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++)
{
double x = t[i].x+location.x;
double y = t[i].y+location.y;
t[i] = point{x, y, t[i].z};
}
return t;
}
我认为实施得当
问题出现在这一行:
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0)); //This semicolon here
return true;
在if语句的末尾放一个分号,基本上就结束了if语句。你写的相当于
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
{
}
return true;
修复它非常简单。只需删除分号:
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
return true;
所以我的问题很简单,有点 "doh"。首先,我必须解决的未解决的问题是 return 正确的,不管我的数学是否真的正确完成,但由于这部分没有被击中,这不是真正的问题。感谢那些注意到它的人。
问题一(否,如果 return true):
在collides.cpp
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
return true;
}
}
固定为:
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
return true;
}
}
第二个问题,也是主要问题,在一位评论者的建议下,他的名字出现在上面的问题中,我仔细检查了 getter 的边界框。瞧,那是我的问题。虽然一开始我对他的建议不以为然,因为我认为我已经完全实施了 getter,但这是我的问题,吸取宝贵的教训总是一件好事。
问题二(GetBounds 的不完整实现,导致空向量得到 returned。):
在asteroids.cpp中:
std::vector asteroid::getBounds()
{
//my issue was here, check your functions a bit more closely :P
//wasn't returning a vector with anything in it.
std::vector<point> t;
//now it's
std::vector<point> t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++)
{
double x = t[i].x+location.x;
double y = t[i].y+location.y;
t[i] = point{x, y, t[i].z};
}
return t;
}
要学习的教训:即使您认为一切正常,但有时您并没有这样做,您应该检查并仔细检查您正在调用的每个函数,以防万一您认为正常工作的函数之一它实际上并没有正常工作。
我有一个 return 是布尔值的函数。这个函数在编译时似乎什么都不包含,并且总是 return true 同时也会跳过我放入其中的所有对 cout 或 cin 的调用。看看它实际上在做什么。这是怎么回事,我该如何解决这个问题。
在我的故障排除过程中,我有,
- 在 object::collides 处使用带有断点的 GDB,这导致函数被调用但未向控制台输出任何内容
- 对我的对象进行编号,并将程序认为发生碰撞的对象与正在发生碰撞的对象进行比较。如果它通过了邻近测试,程序认为对象正在碰撞,证明它总是 returning true。
- 尝试了各种其他方法试图弄清楚发生了什么,但都没有答案
在object.cpp中:
bool object::collides(object * other)
{
std::vector<point> a_pnt = getBounds();
std::vector<point> b_pnt = other->getBounds();
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
point v1 = a_pnt[i];
point v2 = a_pnt[(i+1)%a_pnt.size()];
point v3 = b_pnt[j];
//edit: fixed typo
point v4 = b_pnt[(j+1)%b_pnt.size()];
double num_1 = ((v3.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v3.y - v1.y));
double num_2 = ((v2.x - v1.x) * (v3.y - v1.y)) - ((v3.x - v1.x) * (v2.y - v1.y));
double den =((v2.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v2.y - v1.y));
double frac_1 = num_1 / den;
double frac_2 = num_2 / den;
//debug code start
std::cout << num_1 << "/" << den << "=" << frac_1 << std::endl;
std::cout << num_2 << "/" << den << "=" << frac_2 << std::endl;
std::cout << (frac_1 > 0.0) << " " << (frac_1 < 1.0) << " " << (frac_2 > 0.0) << " " << (frac_2 < 1.0) << std::endl;
std::cout << std::endl;
std::string hahah;
std::cin >> hahah;
//end debug code
//edit: fixed conditional
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0));
return true;
}
}
//edit: fixed conditional
return false;
}
在 mode.cpp 在函数 mode::step()
:
for (int i = 0; i<onScreen.size(); i++)
{
object * o1 = onScreen[i];
for(int j = i+1; j<onScreen.size(); j++)
{
object * o2 = onScreen[j];
if(o1->getVectorLength(o2)<50){
std::cout << "Checking collisions for objects " << i << " and " << j << std::endl;
if(o1->collides(o2))
{
std::cout << "somthing collided\n";
}
}
}
}
输出:
Checking for Collisions
Checking collisions for objects 0 and 11
somthing collided
Checking collisions for objects 1 and 8
somthing collided
Checking collisions for objects 1 and 18
somthing collided
Checking collisions for objects 1 and 26
somthing collided
预期结果是 "collides" 函数输出到屏幕或请求输入该字符串,这将表明它实际上正在正确地执行该部分代码。但是它不会这样做。 "collides" 函数 return 为真,无论实际相交部分是真还是假,同时跳过我所有的调试代码,如输出所示。
编辑:
- 修复了碰撞中的 return
- 修正了一个错字
- 还是不行。
确实会使用 bullet/bullet 组合而不是 bullet/asteroid 或 asteroid/asteroid
进行思考循环
检查 getBounds 让我摸不着头脑……
std::vector asteroid::getBounds() { //我的问题在这里,更仔细地检查你的功能:P //不是 returning 一个包含任何内容的向量。 std::vector t; //现在是 std::vector t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++) { double x = t[i].x+location.x; double y = t[i].y+location.y; t[i] = point{x, y, t[i].z}; } return t;
}
我认为实施得当
问题出现在这一行:
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0)); //This semicolon here
return true;
在if语句的末尾放一个分号,基本上就结束了if语句。你写的相当于
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
{
}
return true;
修复它非常简单。只需删除分号:
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
return true;
所以我的问题很简单,有点 "doh"。首先,我必须解决的未解决的问题是 return 正确的,不管我的数学是否真的正确完成,但由于这部分没有被击中,这不是真正的问题。感谢那些注意到它的人。
问题一(否,如果 return true):
在collides.cpp
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
return true;
}
}
固定为:
for (int i = 0; i < a_pnt.size(); i++)
{
for (int j = 0; j < b_pnt.size(); j++)
{
...
if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
return true;
}
}
第二个问题,也是主要问题,在一位评论者的建议下,他的名字出现在上面的问题中,我仔细检查了 getter 的边界框。瞧,那是我的问题。虽然一开始我对他的建议不以为然,因为我认为我已经完全实施了 getter,但这是我的问题,吸取宝贵的教训总是一件好事。
问题二(GetBounds 的不完整实现,导致空向量得到 returned。):
在asteroids.cpp中:
std::vector asteroid::getBounds()
{
//my issue was here, check your functions a bit more closely :P
//wasn't returning a vector with anything in it.
std::vector<point> t;
//now it's
std::vector<point> t = lyrs[0].pnts;
for (int i = 0; i < t.size(); i++)
{
double x = t[i].x+location.x;
double y = t[i].y+location.y;
t[i] = point{x, y, t[i].z};
}
return t;
}
要学习的教训:即使您认为一切正常,但有时您并没有这样做,您应该检查并仔细检查您正在调用的每个函数,以防万一您认为正常工作的函数之一它实际上并没有正常工作。