两个精灵列表的碰撞 - SFML 2.0

时间:2013-08-26 20:02:00

标签: c++ list sprite sfml

我正在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;
}

1 个答案:

答案 0 :(得分:2)

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

如果你可以使用c ++ 11,我建议你查看每个循环(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);
          }
       }
    }

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