2012-12-20 3 views
2

나는 SFML에서 톱 다운 슈터를 현재 프로그램하려고 시도하지만 문제가 발생했습니다. 저는 C++과 프로그래밍 전반에 대해 매우 익숙합니다. 따라서 지저분한 코드 및/또는 지나치게 복잡한 솔루션을 용서하십시오.별도의 목록에있는 두 개의 스프라이트 충돌

나는 두 개의 std::list을 가지고 있는데, 하나는 무작위로 산란하는 적들을 포함하고 다른 하나는 내가 해고 한 총알을 포함하고 있습니다. 총알이 적과 충돌하면 두 개 모두 지워지지 만 제대로 작동하지 않습니다.

여기 내 코드의 문제 부분 :

나는 몬스터와 플레이어 사이의 충돌을 수행 한 방법
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 

    //Here would be Monster-Movement 

    //Collision Monster-Player (MonsterIt = iterator of MonsterList) 
    if ((MonsterIt -> getPosition().x + 25) >= PlayerX - 25 && 
     (MonsterIt -> getPosition().x - 25) <= PlayerX + 25 && 
     (MonsterIt -> getPosition().y + 25) >= PlayerY - 25 && 
     (MonsterIt -> getPosition().y - 25) <= PlayerY + 25 ) 
    { 
     MonsterList.erase(MonsterIt); 
     break;    
    } 


     window.draw(*MonsterIt); 
} 

. 그건 괜찮 았는데, 그래서 나는 괴물과 레이저와 같은 시도 : 나는 나는 "리스트 반복자가 dereferencable 없습니다"얻을 내가 (오른쪽 //로) 표시 코드의 일부에 넣어

for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
{ 

    //Here would be "Laser-Movement" 

    //Collision-Laser        // Doesn't work 
    if ((MonsterIt -> getPosition().x + 25) >=  // 
     (LaserIt -> getPosition().x - 7) &&  // 
     (MonsterIt -> getPosition().x - 25) <=  // 
     (LaserIt -> getPosition().x + 7) &&  // 
     (MonsterIt -> getPosition().y + 25) >=  // 
     (LaserIt -> getPosition().y - 7) &&  // 
     (MonsterIt -> getPosition().y - 25) <=  // 
     (LaserIt -> getPosition().x + 7))   // 
    {            // 
     MonsterList.erase(MonsterIt);    // 
                // 
     LaserList.erase(LaserIt);     // 
                // 
     break;          // 
    }            // 

    window.draw(*LaserIt); 
} 

-error 내가 촬영하자마자 디버깅하는 동안. 내가 말한 코드를 잘랐을 때 (나는 쏠 수 있고, 괴물에 들어갔다가 사라지는 등). 그렇기 때문에 나머지 코드는 작동하고있는 것 같습니다.

따라서 서로 다른 목록의 반복자간에 충돌이 있습니까? 그렇다면 어떻게해야합니까?

자세한 정보 나 코드가 필요하면 질문하십시오. 나는 당신의 도움에 기뻐할 것입니다 ...

+0

'MonsterIt'이 (가) 두 번째 조각에서 유효한 반복자라는 것을 어떻게 알 수 있습니까? –

+0

그건 내 문제 야. 나는 그것이 유효하지 않기 때문에 그것이 효과가없는 이유라고 생각합니다. 하지만 MonsterList의 일부인 Monster와 LaserList의 일부인 Laser-Shot을 어떻게 충돌시킬 수 있습니까? 내가 말했듯이, 저는 C++을 처음 접했습니다. 제가 반복자를 이해하는 한, 여기 MonsterIt은 목록의 한 멤버의 "이름"입니다. 그게 사실이야? – pantagruel

+0

아닙니다. 'MonsterIt'은 괴물을 가리키는 변수의 이름입니다 ('MonsterIt'은 괴물이 아닌 반복자입니다). – Synxis

답변

0

사용하는 반복자는 유효하지 않습니다.

몇 가지 해결책이 있습니다. 첫 번째 :

for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 
    //Here would be Monster-Movement 

    //Collision Monster-Player (MonsterIt = iterator of MonsterList) 

    // Collision with laser, inside the loop for monsters 
    for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
    { 
    } 

    window.draw(*MonsterIt); 
} 

이 솔루션은 실제로 C++ isn입니다. OOP를 사용하면 훨씬 명확하게 코드를 가질 수 있습니다 그리고

class Player 
{ 
    public: 
     int X, Y; // for code simplicity on SO. 
}; 
// ... 

Player player; 
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 
    MonsterIt->update(player,LaserList); 
    if(!MonsterIt->isAlive()) 
    { 
     // Remove monster from list *without* break 
    } 
} 

Monster는 다음과 같은 클래스 : 클래스 몬스터 살아 { 부울는; public : bool isAlive() const {return alive; }

 bool collideWithPlayer(Player p) const 
     { 
      // Returns whether it collide with player 
      // ... 
     } 

     bool collideWithLaser(Laser l) const 
     { 
      // Returns whether it collide with one laser 
      // ... 
     } 

     bool collideWithLasers(LaserList l) const 
     { 
      for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
       if(collideWithLaser(*LaserIt)) 
        return true; 
      return false; 
     } 


     void update(Player p, LaserList l) 
     { 
      if(collideWithPlayer(p) || collideWithLasers(l)) 
       alive = false; 
      else 
       window.draw(this); 
     } 
}; 
+0

위대한, 나는 그것을 시험해 볼 것이다. 고마워. – pantagruel

관련 문제