From d87143d98b69194d0159231336b2e4a63c887a9a Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Fri, 13 Dec 2024 09:16:03 +0100 Subject: [PATCH] Drobne poprawki --- headers/Player.h | 4 +- sources/Plansza.cpp | 300 ++++++++++++++++++++++---------------------- 2 files changed, 150 insertions(+), 154 deletions(-) diff --git a/headers/Player.h b/headers/Player.h index a3a64d6..ba7e0b5 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -28,11 +28,11 @@ private: std::chrono::steady_clock::time_point lastShotTime = std::chrono::steady_clock::now(); std::vector rockets; sf::Texture rocketTexture; - int health = 3; // Liczba punktów życia gracza sf::Texture bulletTexture; - bool isImmortal = false; // flaga na immortal sf::Clock immortalityClock; // Zegar kontrolujący czas nieśmiertelności + int health = 3; // Liczba punktów życia gracza float immortalityDuration = 1.5f; // Czas trwania nieśmiertelności w sec + bool isImmortal = false; // flaga na immortal }; diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 9e47567..a632cc8 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -5,12 +5,12 @@ #include "../headers/RandomNumberGenerator.h" Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow, - const sf::Texture& playerTexture, - const sf::Texture& playerBulletTexture, - const sf::Texture& playerRocketTexture) - : background("../assets/img/background/background.png", 2.0f), - ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow->getSize().y) - 100, - playerTexture, playerBulletTexture, playerRocketTexture) { + const sf::Texture &playerTexture, + const sf::Texture &playerBulletTexture, + const sf::Texture &playerRocketTexture) + : background("../assets/img/background/background.png", 2.0f), + ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow->getSize().y) - 100, + playerTexture, playerBulletTexture, playerRocketTexture) { window = mainWindow; size.height = static_cast(windowHeight); size.width = static_cast(windowWidth); @@ -33,165 +33,163 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg"); audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3"); - if (!meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png")) { - std::cerr << "Failed to load enemy texture!" << std::endl; - exit(-500); - } - if (!meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png")) { - std::cerr << "Failed to load enemy texture!" << std::endl; + try { + meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); + meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); + // Ładowanie tekstur wrogów + enemyTexture.loadFromFile("../assets/img/enemy/enemy.png"); + advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png"); + BomberEnemyTexture.loadFromFile("../assets/img/enemy/bomber.png"); + KamikadzeTexture.loadFromFile("../assets/img/enemy/kamikadze.png"); + BombaTexture.loadFromFile("../assets/img/bullets/bomba.png"); + WiazkowiecTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png"); + } catch (std::exception &e) { + std::cerr << "Failed to load textures: " << e.what() << std::endl; exit(-500); } - // Ładowanie tekstur wrogów - if (!enemyTexture.loadFromFile("../assets/img/enemy/enemy.png")) { - std::cerr << "Failed to load enemy texture!" << std::endl; - exit(-500); - } - if (!advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png")) { - std::cerr << "Failed to load advanced enemy texture!" << std::endl; - exit(-500); - } - if (!BomberEnemyTexture.loadFromFile("../assets/img/enemy/bomber.png")) { - std::cerr << "Failed to load advanced enemy texture!" << std::endl; - exit(-500); - } - if (!KamikadzeTexture.loadFromFile("../assets/img/enemy/kamikadze.png")) { - std::cerr << "Failed to load advanced enemy texture!" << std::endl; - exit(-500); - } - if (!BombaTexture.loadFromFile("../assets/img/bullets/bomba.png")) { - std::cerr << "Failed to load BombaTexture!" << std::endl; - exit(-500); - } - if (!WiazkowiecTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png")) { - std::cerr << "Failed to load Wiazkowiec texture!" << std::endl; - exit(-500); - } spawnClock.restart(); } void Plansza::update() { // tło - background.update(); - background.draw(*window); + background.update(); + background.draw(*window); - // poruszanie się statkiem - if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { - if(ship.getPosition().x > 50) { - ship.moveLeft(); - } + // poruszanie się statkiem + if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { + if (ship.getPosition().x > 50) { + ship.moveLeft(); } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { - if(ship.getPosition().y > 80) { - ship.moveUp(); - } + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { + if (ship.getPosition().y > 80) { + ship.moveUp(); } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { - if(ship.getPosition().y < 720) { - ship.moveDown(); - } + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { + if (ship.getPosition().y < 720) { + ship.moveDown(); } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { - if(ship.getPosition().x < 550) { - ship.moveRight(); - } + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { + if (ship.getPosition().x < 550) { + ship.moveRight(); } + } - // TODO: Przenieść obiekt dźwięku wewnątrz klasy Bullet - if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { - ship.shoot(); - audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału - } - if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { - ship.alternate_shoot(); - audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału - } + // TODO: Przenieść obiekt dźwięku wewnątrz klasy Bullet + if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { + ship.shoot(); + audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału + } + if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { + ship.alternate_shoot(); + audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału + } - // generowanie nowego meteoru - ship.update(); // migotanie statku - update_score(); // naliczanie punktów - // Sprawnowanie wszystkich rodzajów wrogów - spawn_meteor(); - spawn_enemy(); - spawn_advanced_enemy(); - spawn_wiazkowiec(); - spawn_bomber(); - spawn_kamikadze(); + // generowanie nowego meteoru + ship.update(); // migotanie statku + update_score(); // naliczanie punktów + // Sprawnowanie wszystkich rodzajów wrogów + spawn_meteor(); + spawn_enemy(); + spawn_advanced_enemy(); + spawn_wiazkowiec(); + spawn_bomber(); + spawn_kamikadze(); - // utrzymanie meteorów i pocisków w ruchu - for (auto& meteor : getMeteors()) { - meteor.update(); - window->draw(meteor.getSprite()); - } + // utrzymanie meteorów i pocisków w ruchu + for (auto &meteor: getMeteors()) { + meteor.update(); + window->draw(meteor.getSprite()); + } - for (auto& bullet : ship.getBullets()) { - bullet.update(); - window->draw(bullet.getSprite()); - } + for (auto &bullet: ship.getBullets()) { + bullet.update(); + window->draw(bullet.getSprite()); + } - for (auto& rocket : ship.getRockets()) { - rocket.update(); - window->draw(rocket.getSprite()); - } + for (auto &rocket: ship.getRockets()) { + rocket.update(); + window->draw(rocket.getSprite()); + } - // Sprawdzenie czy meteory i pociski są poza granicami ekranu - update_meteors(); - ship.updateBullets(); + // Sprawdzenie czy meteory i pociski są poza granicami ekranu + update_meteors(); + ship.updateBullets(); - window->draw(ship.getSprite()); + window->draw(ship.getSprite()); - for (auto& meteor : getMeteors()) { - if(ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { + for (auto &meteor: getMeteors()) { + if (ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { ship.takeDamage(); } } - if (!ship.isAlive()) { - sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end"); - sf::Font font; - if (!font.loadFromFile("../assets/fonts/arial.ttf")) { - std::cerr << "Error loading font\n"; - exit(-500); - } - sf::Text text("Your ship is destroyed!", font, 24); - text.setFillColor(sf::Color::Red); - text.setPosition(50, 80); - - // zatrzymanie muzyki i odtworzenie dźwięku przegranej - audioManager.playSoundEffect("fail", 70.f); - audioManager.stopBackgroundMusic(); - sf::Event event{}; - while (errorWindow.isOpen()) { - while (errorWindow.pollEvent(event)) { - if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) { - errorWindow.close(); - window->close(); - exit(-2); - } - } - errorWindow.clear(); - errorWindow.draw(text); - errorWindow.display(); - } + if (!ship.isAlive()) { + sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end"); + sf::Font font; + if (!font.loadFromFile("../assets/fonts/arial.ttf")) { + std::cerr << "Error loading font\n"; + exit(-500); } + sf::Text text("Your ship is destroyed!", font, 24); + text.setFillColor(sf::Color::Red); + text.setPosition(50, 80); - for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end(); ) { - bool meteorHit = false; - for (auto rocketIt = ship.getBullets().begin(); rocketIt != ship.getBullets().end(); ) { - if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - ship.getBullets().erase(rocketIt); - meteorIt = getMeteors().erase(meteorIt); - meteorHit = true; - break; - } else { - ++rocketIt; + // zatrzymanie muzyki i odtworzenie dźwięku przegranej + audioManager.playSoundEffect("fail", 70.f); + audioManager.stopBackgroundMusic(); + sf::Event event{}; + while (errorWindow.isOpen()) { + while (errorWindow.pollEvent(event)) { + if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) { + errorWindow.close(); + window->close(); + exit(-2); } } - if (!meteorHit) { - ++meteorIt; + errorWindow.clear(); + errorWindow.draw(text); + errorWindow.display(); + } + } + + for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { + bool meteorHit = false; + for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + if (meteorIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { + ship.getBullets().erase(bulletIt); + meteorIt = getMeteors().erase(meteorIt); + meteorHit = true; + break; + } else { + ++bulletIt; } } + if (!meteorHit) { + ++meteorIt; + } + } + + for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { + bool meteorHit = false; + for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { + ship.getRockets().erase(rocketIt); + meteorIt = getMeteors().erase(meteorIt); + meteorHit = true; + break; + } else { + ++rocketIt; + } + } + if (!meteorHit) { + ++meteorIt; + } + } // Ruch i render przeciwnika for (auto it = enemies.begin(); it != enemies.end();) { @@ -268,7 +266,7 @@ void Plansza::update() { // Obsługa pocisków zaawansowanych przeciwników - for (auto& aEnemy : AEnemies) { + for (auto &aEnemy: AEnemies) { for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { ship.takeDamage(); // Zadanie obrażeń graczowi @@ -280,7 +278,7 @@ void Plansza::update() { } // Obsługa bomb - for (auto& aEnemy : BEnemies) { + for (auto &aEnemy: BEnemies) { for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { ship.takeDamage(); // Zadanie obrażeń graczowi @@ -292,32 +290,32 @@ void Plansza::update() { } - for (auto& enemy : enemies) { + for (auto &enemy: enemies) { enemy.shoot(); enemy.updateBullets(); - for (auto& bullet : enemy.getBullets()) { + for (auto &bullet: enemy.getBullets()) { bullet.update(); window->draw(bullet.getSprite()); } } - for (auto& advancedEnemy : AEnemies) { + for (auto &advancedEnemy: AEnemies) { advancedEnemy.updateBullets(); // Obsługuje pociski zaawansowanych przeciwników - for (auto& bullet : advancedEnemy.getBullets()) { + for (auto &bullet: advancedEnemy.getBullets()) { bullet.update(); window->draw(bullet.getSprite()); } } - for (auto& bomberEnemy : BEnemies) { + for (auto &bomberEnemy: BEnemies) { bomberEnemy.updateBullets(); // Obsługuje bomby - for (auto& bullet : bomberEnemy.getBullets()) { + for (auto &bullet: bomberEnemy.getBullets()) { bullet.update(); window->draw(bullet.getSprite()); } } - for (auto& enemy : enemies) { + for (auto &enemy: enemies) { for (auto it = enemy.getBullets().begin(); it != enemy.getBullets().end();) { if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Kolizja wykryta @@ -330,7 +328,7 @@ void Plansza::update() { } } - for (auto& bomberEnemy : BEnemies) { + for (auto &bomberEnemy: BEnemies) { for (auto it = bomberEnemy.getBullets().begin(); it != bomberEnemy.getBullets().end();) { bool bulletDestroyed = false; @@ -375,7 +373,7 @@ void Plansza::update() { } } - for (auto& wiazkowiec : WEnemies) { + for (auto &wiazkowiec: WEnemies) { wiazkowiec.update(); if (wiazkowiec.isShooting() && wiazkowiec.getBeam().isVisible()) { @@ -389,7 +387,7 @@ void Plansza::update() { } // Usuwanie pocisków, które są poza ekranem srednio to dziala - for (auto enemyIt = enemies.begin(); enemyIt != enemies.end(); ) { + for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { for (auto bulletIt = enemyIt->getBullets().begin(); bulletIt != enemyIt->getBullets().end();) { if (bulletIt->isOutOfBounds()) { bulletIt = enemyIt->getBullets().erase(bulletIt); // Usuwamy pocisk, który wyszedł poza ekran @@ -603,8 +601,8 @@ void Plansza::update() { void Plansza::update_meteors() { // usuwanie meteorów które wyleciały poza ekran - for (auto& meteor : meteors) { - if(meteor.getStatus()) { + for (auto &meteor: meteors) { + if (meteor.getStatus()) { meteors.erase(meteors.begin()); } } @@ -613,10 +611,10 @@ void Plansza::update_meteors() { void Plansza::spawn_meteor() { if (spawnClock.getElapsedTime().asSeconds() > rand() % 10 + 1) { // randomowy spawn meteorytów od 10 do 1 sekundy if (meteors.size() < 5) { // jeśli jest mniej niż 5 meteorów na planszy - if(rand() % 2 == 1) { - meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50,499), -100, meteorTexture2); + if (rand() % 2 == 1) { + meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, meteorTexture2); } else { - meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50,499), -100, meteorTexture1); + meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, meteorTexture1); } } spawnClock.restart(); @@ -674,8 +672,6 @@ void Plansza::spawn_wiazkowiec() { } - - Size Plansza::getSize() { return size; }