两个精灵列表的冲突-SFML2.0

Collision of two sprite lists - SFML 2.0

本文关键字:冲突 -SFML2 列表 精灵 两个      更新时间:2023-10-16

我正在SFML 2中制作一个简单的游戏,到目前为止进展顺利。我创建了两个sf::精灵列表,一个用于敌人,另一个用于激光。敌人在屏幕外随机产生,只要输入,就会产生激光。我为这两个列表创建了一个冲突循环,并执行了我的代码。不存在编译时和运行时错误。激光敌人碰撞对前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;
}

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

如果您可以使用c++11,我建议查看for each循环(http://www.cprogramming.com/c++11/c++11的范围为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);
          }
       }
    }

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