射击时从列表中删除外星人 - 找出循环; '表达式:无法增加结束列表迭代器'

问题描述 投票:0回答:1

我问了一个关于这个项目的问题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次。它工作的一半时间和另一半,它给出一个错误,表示'表达式:不能增加结束列表迭代器'。

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

c++ list visual-c++
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.