c++ - 射击时从列表中删除外星人 - 找出循环;'表达式:不能增加结束列表迭代器'
问题描述
我之前问过一个关于这个项目的问题(这不是同一个问题),但我正在模仿 Space Invaders 来完成一项任务。我几乎一切正常,但我遇到了子弹外星人交互的问题。我是列表的新手,所以如果这是一个明显的问题,我深表歉意。:)
我有一个功能可以让外星人在与子弹相交时消失,但是当子弹杀死其中两个时,或者如果子弹飞过他们并消失,程序就会陷入无限循环(外循环)。
这是涉及的功能:
(如果您需要查看其他课程的任何内容,我也可以添加)
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 中删除,而是在内部循环之前使用一个为 false 的 bool 变量,如果你发现与任何项目符号的交集,则设置为 true。然后,在内循环之后,检查 bool 变量,看看是否应该删除外星人。然后更容易看到代码在做什么:首先检查外星人是否被任何子弹击中,如果被击中则移除外星人。
推荐阅读
- php - 在mysql上检测重复行并将新值添加到特定行的最佳方法是什么
- c# - 从 CSV 插入数据的问题
- java - Adding tabs to JTabbedPane causes ArrayIndexOutOfBoundsException in thread AWT-EventQueue-0 when tabs take a long time to load
- php - 使用 AJAX 加载更多帖子不起作用
- angular5 - Angular 5 无法从组件函数将数据设置为 ngmodel
- r - 重组比赛/比赛数据
- php - 我正在使用框架 laravel 5.4 ,我有 3 个表(用户、包、联系人)
- reactjs - 在 package.json 中设置主页不会在构建时设置 PUBLIC_URL
- scala - 如何非阻塞地在另一个演员中获得演员?
- angular - 带有 ActivatedRoute 的 Angular 测试组件