在按键时创建一个新对象并将其添加到列表中

Creating a new object upon key press and adding it to a list

我正在使用 C++ 和 sfml 构建 space 射击游戏。 现在我有一颗子弹 class,它只是一个带有一些运动逻辑的圆形。我需要一种方法来存储子弹对象,绘制它们,以及 undraw/delete 一旦它们击中某物或超出范围。我将它们添加到一个列表中,每个项目符号对象都有一个名为 alive 的 bool 属性,我根据行进的距离或与其他对象的碰撞不断更新它。每当它发生碰撞或超出范围时,我都会将 alive 设置为 false。然后我遍历列表以删除 alive 属性为 false 的所有对象。不过,这听起来像是一个可怕的方法,在我从列表中删除项目符号对象后,它们还会被释放吗?

到目前为止,这是我的代码:

if (Keyboard::isKeyPressed(sf::Keyboard::T)) {
        Bullet newBullet(mySub.getSprite().getPosition().x + 64, mySub.getSprite().getPosition().y + 20);
        bulletList.push_back(newBullet);
}
list<Bullet>::iterator it = bulletList.begin();
while (it != bulletList.end()) {
       if (it->getNoDraw() == true) {
            bulletList.erase(it++);
       }
       else {
            it->update();
            if (it->getBulletSprite().getPosition().x > mySub.getSprite().getPosition().x + 1200) {
                    it->setNoDraw();
                }
            }
        }

cout << "list size " << bulletList.size() << endl;
for (list<Bullet>::iterator it = bulletList.begin(); it != bulletList.end(); ++it) {
            window.draw(it->getBulletSprite());
}   

我正在创建一个新的项目符号对象,并在每次按 T 时将其添加到 bulletList,但实际上并没有将新项目符号添加到列表中,因为 bulletList.size() 始终打印 0。任何想法我怎样才能有效地做到这一点?

代码中有一些错误。 您应该重新阅读 erase() 以获得 list,它 returns 是下一个迭代器。 当你不摧毁一颗子弹时,你也错过了在列表中的进步。

if (Keyboard::isKeyPressed(sf::Keyboard::T)) {
        Bullet newBullet(mySub.getSprite().getPosition().x + 64,
                         mySub.getSprite().getPosition().y + 20);
        bulletList.push_back(newBullet);
}
list<Bullet>::iterator it = bulletList.begin();
while (it != bulletList.end()) {
    if (it->getNoDraw() == true) {
        it = bulletList.erase(it); // erase already advance it to the next
    } else {
        it->update();
        if (it->getBulletSprite().getPosition().x >
                mySub.getSprite().getPosition().x + 1200) {
            it->setNoDraw();
        }
        it++; // move on to the next position
    }
}

cout << "list size " << bulletList.size() << endl;
for (list<Bullet>::iterator it = bulletList.begin(); 
     it != bulletList.end(); ++it) {
    window.draw(it->getBulletSprite());
}