嵌套 for 循环的向量下标超出范围
Vector subscript out of range with nested for loops
下面是我用 C++ 和 SFML 编写的游戏代码片段。
if (Keyboard::isKeyPressed(Keyboard::Space)) {
if (fireClock.getElapsedTime().asMilliseconds() > 150) {
Bullet vecBullet(Vector2f(player->getPosition()), player->angle);
bulletVector.push_back(vecBullet);
sleep(milliseconds(5));
fireClock.restart();
}
}
if (Keyboard::isKeyPressed(Keyboard::A)) {
Enemy vecEnemy;
enemyVector.push_back(vecEnemy);
}
for (int i = 0; i < bulletVector.size(); i++) {
bulletVector[i].fire();
bulletVector[i].draw();
}
for (int i = 0; i < enemyVector.size(); i++) {
enemyVector[i].draw();
}
for (int i = 0; i < bulletVector.size(); i++) {
if (bulletVector[i].getPosition().x > 2000 || bulletVector[i].getPosition().x < -100 ||
bulletVector[i].getPosition().y > 1100 || bulletVector[i].getPosition().y < -100) {
bulletVector.erase(bulletVector.begin() + i);
}
}
for (int y = 0; y < bulletVector.size(); y++) {
for (int x = 0; x < enemyVector.size(); x++) {
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
bulletVector.erase(bulletVector.begin() + y);
enemyVector.erase(enemyVector.begin() + x);
}
}
}
}
cout << enemyVector.size() << " " << bulletVector.size() << endl;
发生的情况是,一旦子弹射出,它就会击中敌人,有时它会崩溃并抛出以下错误:
program: C:\WINDOWS\SYSTEM32\MSVCP140D.dll File: c:\program files
(x86)\microsoft
visualstudio17\community\vc\tools\msvc.13.26128\include\vector
Line: 1806
Expression: vector subscript out of range
如果您能给我任何见解,我们将不胜感激,
谢谢你。
正如@Igor Tandetnik 指出的那样,您可以 deleting an element from your array while iterating 和 bulletVector.erase(bulletVector.begin() + y);
有plenty of examples on SO about this topic,我可能就不多解释了
我想在您的代码中指出一些额外的内容。本节中:
for (int y = 0; y < bulletVector.size(); y++) {
for (int x = 0; x < enemyVector.size(); x++) {
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
bulletVector.erase(bulletVector.begin() + y);
enemyVector.erase(enemyVector.begin() + x);
}
}
}
}
哪里找碰撞,这句话是多余的:
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
如果两个向量中的任何一个为空,至少 for
循环中的一个不会迭代单个循环,因此您可以删除该检查并节省一些计算和代码行。
此时,您确保两个向量中至少包含 1 个元素。
下面是我用 C++ 和 SFML 编写的游戏代码片段。
if (Keyboard::isKeyPressed(Keyboard::Space)) {
if (fireClock.getElapsedTime().asMilliseconds() > 150) {
Bullet vecBullet(Vector2f(player->getPosition()), player->angle);
bulletVector.push_back(vecBullet);
sleep(milliseconds(5));
fireClock.restart();
}
}
if (Keyboard::isKeyPressed(Keyboard::A)) {
Enemy vecEnemy;
enemyVector.push_back(vecEnemy);
}
for (int i = 0; i < bulletVector.size(); i++) {
bulletVector[i].fire();
bulletVector[i].draw();
}
for (int i = 0; i < enemyVector.size(); i++) {
enemyVector[i].draw();
}
for (int i = 0; i < bulletVector.size(); i++) {
if (bulletVector[i].getPosition().x > 2000 || bulletVector[i].getPosition().x < -100 ||
bulletVector[i].getPosition().y > 1100 || bulletVector[i].getPosition().y < -100) {
bulletVector.erase(bulletVector.begin() + i);
}
}
for (int y = 0; y < bulletVector.size(); y++) {
for (int x = 0; x < enemyVector.size(); x++) {
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
bulletVector.erase(bulletVector.begin() + y);
enemyVector.erase(enemyVector.begin() + x);
}
}
}
}
cout << enemyVector.size() << " " << bulletVector.size() << endl;
发生的情况是,一旦子弹射出,它就会击中敌人,有时它会崩溃并抛出以下错误:
program: C:\WINDOWS\SYSTEM32\MSVCP140D.dll File: c:\program files (x86)\microsoft visualstudio17\community\vc\tools\msvc.13.26128\include\vector Line: 1806
Expression: vector subscript out of range
如果您能给我任何见解,我们将不胜感激, 谢谢你。
正如@Igor Tandetnik 指出的那样,您可以 deleting an element from your array while iterating 和 bulletVector.erase(bulletVector.begin() + y);
有plenty of examples on SO about this topic,我可能就不多解释了
我想在您的代码中指出一些额外的内容。本节中:
for (int y = 0; y < bulletVector.size(); y++) {
for (int x = 0; x < enemyVector.size(); x++) {
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
bulletVector.erase(bulletVector.begin() + y);
enemyVector.erase(enemyVector.begin() + x);
}
}
}
}
哪里找碰撞,这句话是多余的:
if (enemyVector.size() > 0 && bulletVector.size() > 0) {
如果两个向量中的任何一个为空,至少 for
循环中的一个不会迭代单个循环,因此您可以删除该检查并节省一些计算和代码行。
此时,您确保两个向量中至少包含 1 个元素。