首页 > 解决方案 > 射击时从列表中删除外星人 - 找出循环;'表达式:不能增加结束列表迭代器'

问题描述

我之前问过一个关于这个项目的问题这不是同一个问题),但我正在模仿 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 次。它在一半的时间和另一半的时间里工作,它给出了一个错误,上面写着“表达式:不能增加结束列表迭代器”。

我真的很感激一些建议!谢谢。

标签: c++listvisual-c++

解决方案


在内部循环中有 iter++ 行似乎很奇怪。

例如,想想没有子弹与任何外星人相交的情况。然后我猜您希望代码遍历所有组合,但这不会发生,因为每次没有交集时都会发生 iter++ 行。

我建议不要从内部循环中的 theGang 中删除,而是在内部循环之前使用一个为 false 的 bool 变量,如果你发现与任何项目符号的交集,则设置为 true。然后,在内循环之后,检查 bool 变量,看看是否应该删除外星人。然后更容易看到代码在做什么:首先检查外星人是否被任何子弹击中,如果被击中则移除外星人。


推荐阅读