목록

2014-11-15 6 views
0
내가 Directx9와 및 C++ 하여 콘트라 게임을 쓰고 있어요

내가 코드를 아래에 노력하고 총알목록

의 목록에 대해 저를 도와주세요 C++하지만 오류입니다 : 호환되지 않는 벡터 intertor

std::vector<Bullet*> bullets 
if (mKeyboard->IsKeyPress(DIK_X)) 
{ 
    Bullet* toShoot = new Bullet(noneType, _position.x, _position.y, RIGHT); 
    toShoot->Init(); 
    bullets.push_back(toShoot); 
} 

업데이트 연료 소모량 :

std::vector<Bullet*>::iterator it = bullets.begin(); 


while ((it) != bullets.end()) 
    { 
    (*it)->Update(gameTime, c); 

    if ((*it)->IsLive() == false) 
    { 
     bullets.erase(it++); 
    } 
    } 

렌더링 연료 소모량

std::vector<Bullet*>::iterator it = bullets.begin(); 
while (it != bullets.end()) 
{ 
    if ((*it)->IsLive()) 
    { 
     (*it++)->Render(gr, cx, cy); 
    } 
} 
+0

스택 오버플로에 오신 것을 환영합니다! 귀하의 코드가 실행됩니까? 어떤 오류가 발생합니까? 코드가 실행될 때 무엇을합니까? 무엇을하고 싶니? 당신은 우리가 당신을 도울 수 있도록하기 위해이 모든 질문에 반드시 답해야합니다 ... 그렇지 않으면 우리는 당신이 무엇을 요구하는지조차 정확히 알지 못합니다. –

+0

이 문제는 합리적으로 명확하게 (오탈자를 떠넘기면서) 밝혀졌으며 진단은 C++ nube에서 분명하지 않을 것입니다. –

답변

1

erase(…)에 전달 된 반복자를 증가시킬 수는 없습니다. 대신 다음을 수행하십시오.

if (!(*it)->IsLive()) { 
    it = bullets.erase(it); 
} else { 
    ++it; 
} 

렌더링 기능에 다른 버그가 있습니다. 증가량이 if 블록 내부에 있기 때문에 첫 번째 총알이 아닌 첫 번째 글 머리표에서 멈 춥니 다. 이 while(…)-for(…)은 일반적으로 바람직하다 이유 중 하나입니다 :

for (auto it = bullets.begin(); it != bullets.end(); ++it) { 
    if (…) { 
     … 
    } 
} 

사실, 업데이트 기능도 마찬가지로 변경해야하지만, ++it를 생략합니다.

0

Update 함수에서 벡터를 반복하면서 erase을 호출하고 있습니다. 문제는 벡터에서 지우는 동시에 루프에서 사용중인 경우 it 반복자가 무효화 될 수 있다는 것입니다.

대안은 erase/remove_if 관용구를 사용하는 것이다

#include <algorithm> 
//... 
bullets.erase(std::remove_if(bullets.begin(), bullets.end(), 
       [&](Bullet& b) { b.Update(gameTime, c); return !b.IsLive(); }), 
       bullets.end()); 

기능 remove_if()erase() 함수에 의해 제거 될 탄알 결정하는 호출 알고리즘. 람다에는 총알을 제거해야하는지 결정하는 데 사용 된 논리가 포함됩니다.

+0

감사합니다 @ Marcelo Cantos 완벽하게 실행됩니다. –