2013-08-26 88 views
1

我在SFML 2中做了一个简单的游戏,到目前为止顺利。我创建了两个sf :: Sprite列表,一个用于敌人,一个用于激光。随机产生的敌人离开屏幕,每当输入时就会创建激光。我为这两个列表创建了一个碰撞循环并执行了我的代码。没有编译时和运行时错误。激光与敌人的碰撞对前3到4名敌人都很好,但在此之后,碰撞不会发生。什么可能导致这个问题?请帮助我。谢谢。这是我的代码。两个精灵列表的碰撞 - 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); 
       ++erased; 
     } 
     greenlaserit = reload; 
    } 
    enemyit = next; 
} 

回答

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); 
      } 
     } 
    } 

编辑:否则,一个方法我已经找到搞清楚一个迭代问题是由手通过它加强。我为每个位置绘制两个带有单元格的矩形,并跟踪迭代器并逐步执行逻辑。在每次逻辑迭代之前,写下您的预期结果。然后手工完成,看看你的结果是否符合你的期望。

+0

我没有使用C++ 11。但是,我会尝试你的第二种方法。谢谢。 – WDRKKS

+0

是否有什么特别的原因让你通过创建第二个变量(next,reload)来遍历列表,然后立即迭代它?在我看来,这总是会跳过列表中的第一个元素。 – charzoc

+0

这是为了确保迭代器不会到达list :: end()。当我不使用第二个变量时,它会崩溃。 – WDRKKS