2014-11-15 50 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); 
} 

更新funtion:

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


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

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

渲染funtion

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

歡迎來到Stack Overflow!你的代碼是否運行?你會得到什麼錯誤?代碼在運行時做了什麼?你想要它做什麼?你必須確保解決所有這些問題,以便我們能夠幫助你......否則,我們並不真正知道你甚至在問什麼。 –

+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。問題在於,如果迭代器在循環中使用,並且您正在從矢量中刪除,則迭代器可能會失效。

另一種方法是使用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()功能被去除。請注意,lambda包含您用來確定是否應刪除子彈的邏輯。

+0

謝謝@Marcelo Cantos 它運行完美 –