0

我正在使用 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 条件不再满足。在完成之前它不会进入外循环。问题是,敌人的迭代器正在内部循环中被擦除,我不会增加它,直到程序返回到外部循环。我该如何做到这一点,以便敌人迭代器在被擦除后立即在内循环中递增。我在循环内外调整了很多移动代码,添加了新变量,但仍然没有。请帮我。谢谢。

4

2 回答 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);
            break;
        }
        greenlaserit = reload;
    }
    enemyit = next;
}
于 2013-09-02T19:26:08.310 回答
0

像这样的东西会起作用吗?我交换了 while 循环并使用了 Guga00 的建议,即在break. 这样,您遍历所有greenlaserits 并检查每个enemyit,如果有交集,则擦除enemyitandgreenlaserit然后将next迭代器分配给enemyit,然后break退出并将reload迭代器分配给greenlaserit。如果没有交叉点,它只是正常循环。

std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload;
while(greenlaserit != greenlaser.end())
{
    reload = greenlaser;
    reload++;
    while(enemyit != enemyit.end())
    {
        next = enemyit;
        next++;
        if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds()))
        {
            enemy.erase(enemyit);
            greenlaser.erase(greenlaserit);
            enemyit = next;
            break;
        }
        else
        {
            enemyit = next;
        }
    }
    greenlaserit = reload;
}
于 2013-09-02T22:21:11.603 回答