在按键时创建一个新对象并将其添加到列表中
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());
}
我正在使用 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());
}