使用迭代器在SFML 2.0中列表之间发生冲突

时间:2013-09-02 19:03:42

标签: c++ list iterator sprite sfml

我正在使用SFML 2.0编写游戏,其中两个精灵列表之间存在冲突。碰撞代码非常正确,但是以某种方式混淆了交互器。我不知道如何解决这个问题。这是我的代码。

std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload;
while(enemyit != enemy.end())
{
    next = enemyit;
    next++;
    while(greenlaserit != greenlaser.end())
    {
        reload = greenlaserit;
        reload++;
        if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds()))
        {
            enemy.erase(enemyit);
            greenlaser.erase(greenlaserit);
        }
        greenlaserit = reload;
    }
    enemyit = next;
}

这里有两个while循环,我正在做的是我使用内循环来检查碰撞,如果发生碰撞,我正在擦除敌人迭代器。在这样做之后,内部循环将保持循环,直到while条件停止满足。它完成之前不会进入外循环。问题是,敌人迭代器正在内循环中被删除,我没有递增它,直到程序返回到外循环。我如何做到这一点,以便敌人迭代器一旦被删除就在内循环中递增。我已经在循环内外调整了大量移动代码,添加了新变量,但仍然没有。请帮我。感谢。

2 个答案:

答案 0 :(得分:0)

如果你只想增加敌人,你为什么不在外面突破?

std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload;
while(enemyit != enemy.end())
{
    next = enemyit;
    next++;
    while(greenlaserit != greenlaser.end())
    {
        reload = greenlaserit;
        reload++;
        if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds()))
        {
            enemy.erase(enemyit);
            greenlaser.erase(greenlaserit);
            break;
        }
        greenlaserit = reload;
    }
    enemyit = next;
}

答案 1 :(得分:0)

这样的事情会起作用吗?我交换了while循环并使用了Guga00建议投掷break。这样,您遍历所有greenlaserit并检查每个enemyit,如果有交叉点,则删除enemyitgreenlaserit,然后分配{{1}迭代器到next,然后enemyit并将break迭代器分配给reload。如果没有交叉点,它只是正常循环。

greenlaserit