1

我正在用 SFML 2 制作一个简单的游戏,到目前为止进展顺利。我创建了两个 sf::Sprite 列表,一个用于敌人,一个用于激光。敌人在屏幕外随机生成,并在输入时创建激光。我为两个列表创建了一个碰撞循环并执行了我的代码。没有编译时和运行时错误。激光与敌人的碰撞对前 3 到 4 个敌人效果很好,但之后就不会发生碰撞。什么可能导致这个问题?请帮助我。谢谢。这是我的代码。

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);
                ++erased;
        }
        greenlaserit = reload;
    }
    enemyit = next;
}
4

1 回答 1

2

似乎您正在进行大量迭代器操作,这很可能是问题发生的地方。

如果您可以使用 c++11,我建议您查看 for each 循环(http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html),以保持事情真的很容易阅读和理解(因此更容易调试)。

你可以这样做:

    std::list<sf::Sprite> enemies;
    std::list<sf::Sprite> lasers;

    for (sf::Sprite enemy: enemies) {
       for (sf::Sprite laser : lasers) {
          if (enemy.getGlobalBounds().intersects(laser.getGlobalBounds())) {
            enemies.remove(enemy);
            lasers.remove(laser);
          }
       }
    }

编辑:否则,我发现找出迭代器问题的一种方法是手动单步执行。我为每个位置绘制了两个带有单元格的矩形,并跟踪迭代器并逐步运行逻辑。在您的逻辑的每次迭代之前,写下您的预期结果。然后手动检查,看看你的结果是否符合你的期望。

于 2013-08-28T01:34:10.897 回答