Piszę prostą grę w SFML. Chcę aby po uderzeniu pocisku w przeciwnika znikał on. Nie wiem dlaczego linia 159 sprawia problem. Kiedy odpalam program w momencie spotkania się pocisku z przeciwnikiem VS 2019 wywala mi błąd : Vector subscript out of range. Jak mam to naprawić i dlaczego to nie działa skoro kilka linii niżej używam dokładnie tego samego kodu do usuwania pociskow kiedy wylecą poza mapę?
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <SFML/Graphics.hpp>
int main()
{
const int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 600;
const float PLAYER_Y_POS = 500.0f;
int score = 0;
bool space_pressed = false;
bool bullet_on_fire = false;
bool enemy_going_right[5] = {
true, true, true, true, true
};
std::vector<sf::Sprite> bullets;
// Window init
sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Aliens invasion");
window.setVerticalSyncEnabled(true);
sf::Font my_font;
if (!my_font.loadFromFile("myFont.ttf"))
{
std::cout << "Failed to load a font" << std::endl;
}
sf::Text text;
text.setFont(my_font);
text.setCharacterSize(20);
std::string score_text;
sf::Texture background_texture;
if (!background_texture.loadFromFile("background.jpg"))
{
std::cout << "Failed to load background" << std::endl;
}
sf::Sprite backgorund(background_texture, sf::IntRect(0, 0, 800, 600));
// Player init
sf::Texture player_texture;
if (!player_texture.loadFromFile("player.png"))
{
std::cout << "Failed to laod player texture" << std::endl;
}
sf::Sprite player;
player.setTexture(player_texture);
player.setPosition(sf::Vector2f(400.0f, PLAYER_Y_POS));
player.setScale(sf::Vector2f(2.0f, 2.0f));
sf::Texture bullet_texture;
if (!bullet_texture.loadFromFile("bullet.png"))
{
std::cout << "Failed to load bullet texture" << std::endl;
}
sf::Sprite bullet;
sf::Texture enemy_texture;
if (!enemy_texture.loadFromFile("enemy.png"))
{
std::cout << "Failed to load enemy image" << std::endl;
}
srand(time(NULL));
sf::Sprite enemies[5];
for (int i = 0; i < 5; i++)
{
enemies[i].setTexture(enemy_texture);
enemies[i].scale(sf::Vector2f(2.0f, 1.5f));
enemies[i].setPosition(sf::Vector2f(float(rand() % 740 + 0), float(rand() % 300)));
}
sf::Clock game_clock;
while (window.isOpen())
{
float deltaTime = game_clock.restart().asMilliseconds();
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
if (event.key.code == sf::Keyboard::Escape)
window.close();
else if (event.key.code == sf::Keyboard::Space && !space_pressed)
{
space_pressed = true;
std::cout << "Space pressed!!!" << std::endl;
bullets.push_back(bullet);
bullets.back().setPosition(sf::Vector2f(player.getPosition().x + 16, PLAYER_Y_POS));
bullets.back().setTexture(bullet_texture);
std::cout << bullets.size() << std::endl;
}
break;
case sf::Event::KeyReleased:
if (event.key.code == sf::Keyboard::Space && space_pressed)
{
space_pressed = false;
}
break;
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
player.move(sf::Vector2f(-0.3f * deltaTime, 0.0f));
if (player.getPosition().x <= 0.0f)
player.setPosition(sf::Vector2f(0.0f, PLAYER_Y_POS));
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
player.move(sf::Vector2f(0.3f * deltaTime, 0.0f));
if (player.getPosition().x >= 740.0f)
player.setPosition(sf::Vector2f(740.0f, PLAYER_Y_POS));
}
for (int i = 0; i < 5; i++)
{
if (enemy_going_right[i])
{
enemies[i].move(sf::Vector2f(0.2f * deltaTime, 0.0f));
if (enemies[i].getPosition().x >= 740.0f)
{
enemies[i].setPosition(sf::Vector2f(740.0f, enemies[i].getPosition().y + 10.0f));
enemy_going_right[i] = false;
}
}
else
{
enemies[i].move(sf::Vector2f(-0.2f * deltaTime, 0.0f));
if (enemies[i].getPosition().x <= 0.0f)
{
enemies[i].setPosition(sf::Vector2f(0.0f, enemies[i].getPosition().y + 10.0f));
enemy_going_right[i] = true;
}
}
}
for (int z = 0; z < bullets.size(); z++)
{
bullets[z].move(0.0f, -1.0f * deltaTime);
for (int i = 0; i < 5; i++)
{
if (enemies[i].getGlobalBounds().intersects(bullets[z].getGlobalBounds()))
{
bullets.erase(bullets.begin() + z);
enemies[i].setPosition(sf::Vector2f(float(rand() % 740 + 0), float(rand() % 300)));
score++;
}
}
if (bullets[z].getPosition().y <= 0.0f)
bullets.erase(bullets.begin() + z);
}
score_text = std::to_string(score);
text.setString("Score: " + score_text);
window.clear();
window.draw(backgorund);
window.draw(player);
for (int i = 0; i < 5; i++)
{
window.draw(enemies[i]);
}
for (int i = 0; i < bullets.size(); i++)
{
window.draw(bullets[i]);
}
window.draw(text);
window.display();
}
return 0;
}