这是我对此网站的第一个问题。我学习了一年的编程,并且总是在项目中找到解决我问题的答案。我知道这是一个非常简单的问题,这是一个代码:
next(element for element in tag if element['Key'] == filters[0]['Key'])['Value'] in filters[0]['Value']
=> True
碰撞工作正确,但是当子弹碰到索引为5的敌人时,代码总是删除最后索引的敌人,因此我可以删除仅向具有索引5或1或7的一个敌人射击的每个敌人。
答案 0 :(得分:0)
执行enemyArray.erase(...)
时,请勿增加i
,因为您将跳过一个元素。
所以您应该像这样重写循环:
for (int i = 0; i < enemyArray.size();) {
if (player->checkShoot()) {
if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
player->addScore(10);
enemyArray.erase(enemyArray.begin() + i);
continue;
}
}
}
++i;
}
或者,采用更惯用的风格:
for (auto it = enemyArray.begin(), end = enemyArray.end();it!=end;) {
if (player->checkShoot()) {
if ((bullet->getPositionX() >= it->getPositionX() && bullet->getPositionX() <= it->getPositionX() + 5)) {
if ((bullet->getPositionY() >= it->.getPositionY() && bullet->getPositionY() <= it->getPositionY() + 5)) {
player->addScore(10);
enemyArray.erase(it);
continue;
}
}
}
++it;
}
当然,如果您一次要清除一个敌人,则在删除元素后,应该break
而不是continue
来循环。
为了完整起见,如果要删除所有被子弹碰到的敌人,也可以使用std::remove_if
,它比上面的2个循环更好,因为删除多个元素时元素移动较少。 / p>