-2

我正在使用 C++ 中的 SFML 和 MS Visual Studio 10 制作这个基于空间的射击游戏。所以,我的敌人精灵在 std::list 中声明。为了让它们无限期地出现,我在列表中使用了大尺寸。但是,这会影响性能,并最终会在一段时间后终止。因此,我选择在每次删除一个元素时将一个元素 push_back() 放入列表中,以保持列表的大小不变并无限次生成敌人。这不会影响性能。然而,每次删除一个敌方精灵时,都会在位置 (0,0) 即左上角生成一个新的精灵。因此,为了在屏幕外随机生成它们的位置,我使用了相同的 RNG,用于在程序开始时初始化它们的位置。现在,它们是在屏幕外随机生成的,但整个列表正在被删除,并且正在再次生成一个新列表。这是我的代码:

std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
    while(enemyit != enemy.end())
    {
        next = enemyit;
        next++;
        if(enemyit->getGlobalBounds().intersects(player.getGlobalBounds()))
        {
            enemy.erase(enemyit);
            enemy.push_back(sf::Sprite(enemytex));
            srand(time(NULL));
            float y = -200;
            for(std::list<sf::Sprite>::iterator enemyit = enemy.begin(); enemyit != enemy.end(); enemyit++)
            {
                float x = rand() % dist + wastage;
                enemyit->setPosition(x, y);
                y = y - enemyit->getGlobalBounds().height * 2;
            }
        }
        enemyit = next;
    }

显然,这是for循环。我正在迭代整个列表。如何更改它以便在只擦除一个元素时只生成一个元素?我应该设置什么条件?据我所知,我已经尝试了一切,但没有。请帮助我。

4

1 回答 1

1

首先,您的实际代码会给您带来很多关于循环(while 和 for)的问题,以及在使用迭代器时添加或删除列表的项目。

解决您的问题的最佳方法是执行第一个循环以检查所有已摧毁的敌人,然后在检查后进行循环以生成它们。

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

for( int i = 0; i < erasedEnemies; ++i )
{
    sf::Sprite tempSprite(enemytex);    
    srand(time(NULL));
    float y = -200;
    float x = rand() % dist + wastage;
    tempSprite.setPosition(x, y);
    y = y - tempSprite.getGlobalBounds().height * 2;
    enemy.push_back(tempSprite);
}

希望它可以帮助你。

于 2013-08-09T11:02:09.093 回答