2017-04-23 28 views
0

第一个函数调用将返回两个对象发生碰撞时的字符串冲突,因此我知道我的逻辑是真实的。然而,布尔检查没有返回,所以我很难过。如何返回for循环中的布尔值

template <typename T, typename U> 
void checkCollision(std::vector<T> &vTower, std::vector<U> &vMonster) 
{ 
    for (int i = 0; i < vMonster.size(); i++) 
    { 
     for (int k = 0; k < vTower.size(); k++) 
     { 
      if (vMonster[i].getPositionX() + vMonster[i].getRadius() + 
       vTower[k].getRadius() > vTower[k].getTowerRangePositionX() 
       && vMonster[i].getPositionX() < vTower[k].getTowerRangePositionX() + vMonster[i].getRadius() + vTower[k].getRadius() 
       && vMonster[i].getPositionY() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionY() 
       && vMonster[i].getPositionY() < vTower[k].getTowerRangePositionY() + vMonster[i].getRadius() + vTower[k].getRadius()) 
      { 
       std::cout << "Collided" 
      } 

     } 
    } 
}; 

这从主

bool checkCollision(std::vector<T> &vTower, std::vector<U> &vMonster) 
{ 
    for (int i = 0; i < vMonster.size(); i++) 
    { 
     for (int k = 0; k < vTower.size(); k++) 
     { 
      if (vMonster[i].getPositionX() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionX() 
       && vMonster[i].getPositionX() < vTower[k].getTowerRangePositionX() + vMonster[i].getRadius() + vTower[k].getRadius() 
       && vMonster[i].getPositionY() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionY() 
       && vMonster[i].getPositionY() < vTower[k].getTowerRangePositionY() + vMonster[i].getRadius() + vTower[k].getRadius()) 
      { 
       return true; 
      } 
      else 
       return false; 
     } 
    } 
} 

这是一个无休止的循环窗口调用时没有返回。

if(function.checkCollision(myicetower, mymonsters)) 
     std::cout << "TESTTESTTEST" << std::endl; 
+1

在第二个例子中,你只比较第一个怪物和第一个塔,因为你总是从那个点返回。 – aschepler

+0

请修复您的问题标题。让它描述这个问题。其他人应该如何找到这个问题呢? –

回答

1

只要您找到一个不匹配的对象,就会发生您的return false。它需要waaayyyyy的功能 - 底部。一旦你检查了一切,没有匹配,那么你可以说没有任何匹配。

+0

我在想什么,甚至不能做一个简单的布尔值我应该知道更好。我接受你的修理者 –

0

正如John指出的那样,将return语句移到末尾就足够了。但是你也可以考虑看看标准算法。

使用std::any_of,你的函数可以被改写为

bool checkCollision(std::vector<T> const& towers, std::vector<U> const& monsters) { 
    auto const has_collision = [](T const& tower, U const& monster) { 
     return monster.getPositionX() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionX() 
      && monster.getPositionX() < tower.getTowerRangePositionX() + monster.getRadius() + tower.getRadius() 
      && monster.getPositionY() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionY() 
      && monster.getPositionY() < tower.getTowerRangePositionY() + monster.getRadius() + tower.getRadius(); 
    }; 

    return std::any_of(monsters.cbegin(), monsters.cend(), 
     [&towers](auto const& monster) { 
      return std::any_of(towers.cbegin(), towers.cend(), 
       [&monster](auto const& tower) { 
        return has_collision(tower, monster); 
       }); 
     }); 
} 

这虽然还不够完善,是更可读(它读作“有什么怪物,对此有任何塔与它碰撞“)并且比手写循环更不容易出错。

如果在您的代码库中检查是否有一对元素(第一个来自一个容器并且第二个来自另一个容器)满足某些条件,您还可以考虑编写封装它的自定义any_of你可以写点类似

bool checkCollision(std::vector<T> const& towers, std::vector<U> const& monsters) { 
    auto const has_collision = [](T const& tower, U const& monster) { 
     return monster.getPositionX() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionX() 
      && monster.getPositionX() < tower.getTowerRangePositionX() + monster.getRadius() + tower.getRadius() 
      && monster.getPositionY() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionY() 
      && monster.getPositionY() < tower.getTowerRangePositionY() + monster.getRadius() + tower.getRadius(); 
    }; 

    return any_of(towers.cbegin(), towers.cend(), 
        monsters.cbegin(), monsters.cend(), 
        has_collision); 
} 

改为。