我问了一个关于这个项目的问题previously(这不是同一个问题),但我正在模仿太空侵略者进行任务。我几乎所有的东西都在工作,但是我遇到了子弹 - 外星人互动的问题。我是名单的新手,所以如果这是一个明显的问题我会道歉。 :)
我有一个让外星人与子弹相交时消失的功能,但是当子弹击中其中两个子弹时,或者当子弹飞过它们并消失时,程序会陷入无限循环(外环)。
这是涉及的功能:
(如果你需要从其他类看到任何东西,我也可以添加它们)
void alienGroupMgr::disappear(shotMgr m)
{
// shotMgr is just a class that manages the bullet data (vector of ptrs to bullets)
// getSprite returns data about individual sprites
for (list<alien*>::iterator iter = theGang.begin();iter != theGang.end();) // each alien
{
alien* ptrShot = *iter;
FloatRect alienBound = ptrShot->getSprite().getGlobalBounds();
// theGang is a list of ptrs to aliens from the alien group mgr class
// alien is a class for each alien
for (int i = 0; i < m.getAmountFilled(); i++) // each bullet
{ // getlist returns an index from the vector of bullet ptrs
FloatRect bulletBound = m.getList(i)->getSprite().getGlobalBounds();
if (alienBound.intersects(bulletBound))
{
iter = theGang.erase(iter);
}
else
{
iter++;
}
}
}
}
我测试了一个函数的版本,我通过使用计数器将外循环限制为9次。它工作的一半时间和另一半,它给出一个错误,表示'表达式:不能增加结束列表迭代器'。
我真的很感激一些建议!谢谢。
在内循环中有iter ++行似乎很奇怪。
例如,想想没有子弹与任何外星人相交的情况。然后我想你希望代码经历所有组合,但这不会发生,因为每次没有交集时你都会发生iter ++线。
我建议不要在内部循环中从theGang中删除,而是在内部循环之前使用bool变量,如果找到与任何项目符号的交集,则设置为true。然后,在内循环之后,检查bool变量以查看是否应该删除外星人。然后更容易看到代码正在做什么:首先检查外星人是否被任何子弹击中,然后移除外星人,如果它被击中。