Векторный индекс вне диапазона в игре SFML - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над игрой как проектом для моего курса по разработке игр. Он использует векторы для появления врагов в верхней части экрана и запуска, а также создает «пули», которые запускаются как игроком, так и боссом. После добавления босса и кода для его пуль, ранее работающий код теперь выбрасывает векторный индекс из-за ошибки диапазона. Эта ошибка всегда появляется сразу после попадания по врагу и не возникала до появления босса.

            bullets[i].shape.move(bullets[i].currVelocity);

            //Bullet Removal
            if (bullets[i].shape.getPosition().x < 0 || bullets[i].shape.getPosition().x > window.getSize().x
                || bullets[i].shape.getPosition().y < 0 || bullets[i].shape.getPosition().y > window.getSize().y) {
                bullets.erase(bullets.begin() + i);
            }
            else {
                //Collision Code
                for (size_t k = 0; k < enemies.size(); k++) {
                    if (bullets[i].shape.getGlobalBounds().intersects(enemies[k].getGlobalBounds())) {
                        bullets.erase(bullets.begin() + i);
                        enemies.erase(enemies.begin() + k);
                        score = score + 1;
                        fiveScore = fiveScore + 1;
                        std::cout << "Score: " << score << std::endl;
                        hitSound.play();
                        if (fiveScore == 5) {
                            fiveScore = 0;
                            //scoreUpSound.play();
                        }
                        if (score >= 100 && bossSpawned == false) {
                            bossSpawned = true;
                            boss.setPosition(250.0f, 50.0f);
                        }
                        break;
                    }
                }
                if (bullets[i].shape.getGlobalBounds().intersects(boss.getGlobalBounds())) {
                    bullets.erase(bullets.begin() + i);
                    hitSound.play();
                    bossHP = bossHP - 1;
                    if (bossHP <= 0) {
                        bossSpawned = false;
                        boss.setPosition(3214.0f, 4322.0f);
                        text.setString("You have completed your quest." "\n" "The warlock is slain and the realm is" "\n" "safe, yet as life returns to the kingdom" "\n" "you are dissatisfied. Your brother and" "\n" "lover are both deceased and" "\n" "you feel only death will heal your pain.");
                        text.setPosition(25.0f, 150.0f);
                        window.clear();
                        window.draw(text);
                        window.display();
                        Sleep(9000);
                        return 0;
                    }
                    break;
                }
            }
        }

Это код для столкновения пуль игрока.

            b2.shape.setPosition(bossCenter);
            b2.currVelocity = bossAimDirNorm * b2.maxSpeed;

            bossbullets.push_back(BossBullet(b2));
        }

        for (size_t z = 0; z < bossbullets.size(); z++) {
            bossbullets[z].shape.move(bossbullets[z].currVelocity);

            //BossBullet Removal
            if (bossbullets[z].shape.getPosition().x < 0 || bossbullets[z].shape.getPosition().x > window.getSize().x
                || bossbullets[z].shape.getPosition().y < 0 || bossbullets[z].shape.getPosition().y > window.getSize().y) {
                bossbullets.erase(bossbullets.begin() + z);
            }
            else {
                //Collision Code
                if (bossbullets[z].shape.getGlobalBounds().intersects(player.getGlobalBounds())) {
                        bossbullets.erase(bossbullets.begin() + z);
                        playerDead = true;
                        text.setString("You have failed your quest.");
                        text.setPosition(150.0f, 150.0f);
                        window.clear();
                        window.draw(text);
                        window.display();
                        Sleep(5000);
                        return 0;
                }
            }
        }

Это код для столкновения босса Любая помощь или даже идеи о том, что может быть не так, будут полезны. Возвращаясь к тому, что я добавил, это единственное решение, которое я нашел на данный момент.

1 Ответ

1 голос
/ 17 февраля 2020

Вы стираете из своего вектора, зацикливаясь на нем. Это изменяет размер вашего вектора, который часто может быть источником ошибок.

Взгляните на Удалите элементы вектора внутри l oop, чтобы найти способ сделать это вместо этого. .

...