子弹列表c ++

时间:2014-11-15 03:39:01

标签: c++ directx-9

我用Directx9和c ++编写Contra Game 请帮助我了解子弹列表

我尝试下面的代码,但它的错误:vector 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);
    }
}

2 个答案:

答案 0 :(得分:1)

您不能只增加传递给erase(…)的迭代器。这样做:

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

您的渲染功能有不同的错误。它被卡在第一个非实时子弹上,因为增量在if块内。这是for(…)通常优于while(…)的一个原因:

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

实际上,Update功能也应该同样改变,但省略++it

答案 1 :(得分: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()函数将删除哪些项目符号。请注意,lambda包含用于确定是否应删除子弹的逻辑。