我的 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.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 为真,无论实际相交部分是真还是假,同时跳过我所有的调试代码,如输出所示。

编辑:

问题出现在这一行:

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;
}

要学习的教训:即使您认为一切正常,但有时您并没有这样做,您应该检查并仔细检查您正在调用的每个函数,以防万一您认为正常工作的函数之一它实际上并没有正常工作。