2013-08-26 7 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

iterator가 list :: end()에 도달하지 않도록하는 것이 었습니다. 두 번째 변수를 사용하지 않으면 충돌이 발생합니다. – WDRKKS