Векторный индекс вне диапазона с вложенными циклами - PullRequest
0 голосов
/ 02 мая 2018

ниже приведен фрагмент кода из игры, которую я пишу на 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;

Что происходит, когда пуля попадает в противника, а иногда падает и выдает следующую ошибку:

программа: C: \ WINDOWS \ SYSTEM32 \ MSVCP140D.dll Файл: c: \ program files (X86) \ Microsoft VisualStudio \ 2017 \ сообщества \ Vc \ Tools \ MSVC \ 14.13.26128 \ включить \ вектор Линия: 1806

Выражение: нижний индекс вектора вне диапазона

Буду очень признателен за любые идеи, которые вы можете мне дать, Спасибо.

1 Ответ

0 голосов
/ 11 мая 2018

Как отметил @Igor Tandetnik, вы могли бы удалить элемент из вашего массива, итерируя с bulletVector.erase(bulletVector.begin() + y);

Есть множество из примеров по SO о этой теме , и я, вероятно, не буду объяснять это лучше.


Я бы хотел указать что-то еще в вашем коде. В этом разделе:

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 элемент внутри.

...