diff --git a/headers/Plansza.h b/headers/Plansza.h index 5b6ae1e..5365dd8 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -36,8 +36,15 @@ public: void update_meteors(); void update_hearts(); void update_power_ups(); + + void update(); void update_score(); + + void check_PowerUp_collisions(); + void check_Heart_collisions(); + void check_Meteor_collisions(); + void spawn_player(); void spawn_enemy(); void spawn_advanced_enemy(); @@ -50,13 +57,13 @@ public: static ships selectedShip; static unsigned int score; + sf::Font font; private: Background background; AudioManager audioManager; Player *ship; Size size; sf::RenderWindow *window; - sf::Font font; sf::Clock meteorSpawnClock; sf::Clock heartSpawnClock; sf::Clock powerUpSpawnClock; diff --git a/main.cpp b/main.cpp index 94f4aad..e158890 100644 --- a/main.cpp +++ b/main.cpp @@ -19,6 +19,7 @@ int main() { icon.loadFromFile("../assets/img/icon/ikonka.png"); mainWindow.setIcon(128, 128, icon.getPixelsPtr()); + bool isPaused = false; Plansza plansza(mainWindow.getSize().y, mainWindow.getSize().x, &mainWindow, selectedShip); @@ -32,9 +33,27 @@ int main() { mainWindow.close(); } - plansza.update(); - mainWindow.display(); + // Obsługa pauzy + if (event.key.code == sf::Keyboard::P) { + isPaused = !isPaused; + + sf::RectangleShape bg(sf::Vector2f(mainWindow.getSize().x, mainWindow.getSize().y)); + bg.setFillColor(sf::Color(0,0,0,100)); + sf::Text text("PAUZA", plansza.font, 50); + text.setOrigin(text.getLocalBounds().getSize().x/2, text.getLocalBounds().getSize().y/2); + text.setFillColor(sf::Color::White); + text.setPosition(mainWindow.getSize().x/2, mainWindow.getSize().y/2); + plansza.update(); + mainWindow.draw(bg); + mainWindow.draw(text); + mainWindow.display(); + } + + if (!isPaused) { // jesli nie spauzowane to graj + plansza.update(); + mainWindow.display(); + } } return 0; @@ -121,6 +140,9 @@ void menu() { menuWindow.close(); exit(-2); } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Enter)) { + menuWindow.close(); + } if (event.type == sf::Event::MouseButtonPressed) { if (event.mouseButton.button == sf::Mouse::Left) { diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 403bac0..84b6f5c 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -72,7 +72,7 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render // TODO: Refactor tej metody bo rozrosła się za bardzo już void Plansza::update() { - srand(time(0)); + srand(time(0)); // generacja innego ziarna na podstawie zegara systemowego // tło background.update(); background.draw(*window); @@ -109,18 +109,17 @@ void Plansza::update() { // 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_hearts(); + spawn_meteor(); + spawn_hearts(); spawn_power_up(); - // spawn_enemy(); - // spawn_advanced_enemy(); - // spawn_wiazkowiec(); - // spawn_bomber(); - // spawn_kamikadze(); + spawn_enemy(); + spawn_advanced_enemy(); + spawn_wiazkowiec(); + spawn_bomber(); + spawn_kamikadze(); // utrzymanie meteorów i pocisków w ruchu for (auto &meteor: meteors) { @@ -156,44 +155,9 @@ void Plansza::update() { window->draw(ship->getSprite()); - for (auto &meteor: meteors) { - if (ship->getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { - ship->takeDamage(); - } - } - - for (auto heartIt = hearts.begin(); heartIt != hearts.end();) { - if (ship->getSprite().getGlobalBounds().intersects(heartIt->getSprite().getGlobalBounds())) { - ship->healUP(); - heartIt = hearts.erase(heartIt); - } else { - ++heartIt; - } - } - - // TODO: Dodać obsługę kilku różnych power-upów - - //////////////////////////////////////////////////////////////////////////////////////////////// - // Sprawdzenie kolizji z power-upem na prędkość poruszania się i zwiększenie prędkości statku - for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) { - if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) { - if (powerUpIt->getType() == PowerUp::movingSpeedUp) { - ship->setMovingSpeed(15.0f); - movingSpeedPUTimer.restart(); - } - if (powerUpIt->getType() == PowerUp::firerateUp) { - ship->setFirerate(100); - fireratePUTimer.restart(); - } - if (powerUpIt->getType() == PowerUp::tripleShotUp) { - ship->setTripleShot(true); - tripleShotPUTimer.restart(); - } - powerUpIt = powerUps.erase(powerUpIt); - } else { - ++powerUpIt; - } - } + check_Meteor_collisions(); + check_Heart_collisions(); + check_PowerUp_collisions(); if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f) { ship->setMovingSpeed(8.0f); @@ -204,43 +168,6 @@ void Plansza::update() { if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f) { ship->setTripleShot(false); } - ///////////////////////////////Koniec obsługi kolizji z power-upami////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////// - - 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; - } - } - 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; - } - } - if (gameOver) { sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end"); @@ -305,6 +232,40 @@ void Plansza::update() { } } + 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();) { it->update(); // Aktualizacja kierunku i ruchu @@ -769,8 +730,8 @@ void Plansza::update_power_ups() { } void Plansza::spawn_meteor() { - if (meteorSpawnClock.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 (meteorSpawnClock.getElapsedTime().asSeconds() > rand() % 30 + 5) { // randomowy spawn meteorytów od 10 do 1 sekundy + if (meteors.size() < 3) { // jeśli jest mniej niż 5 meteorów na planszy if (rand() % 2 == 1) { meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, meteorTexture2); } else { @@ -890,5 +851,46 @@ void Plansza::update_score() { window->draw(text); } +void Plansza::check_PowerUp_collisions() { + for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) { + if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) { + if (powerUpIt->getType() == PowerUp::movingSpeedUp) { + ship->setMovingSpeed(15.0f); + movingSpeedPUTimer.restart(); + } + if (powerUpIt->getType() == PowerUp::firerateUp) { + ship->setFirerate(100); + fireratePUTimer.restart(); + } + if (powerUpIt->getType() == PowerUp::tripleShotUp) { + ship->setTripleShot(true); + tripleShotPUTimer.restart(); + } + powerUpIt = powerUps.erase(powerUpIt); + } else { + ++powerUpIt; + } + } +} + +void Plansza::check_Heart_collisions() { + for (auto heartIt = hearts.begin(); heartIt != hearts.end();) { + if (ship->getSprite().getGlobalBounds().intersects(heartIt->getSprite().getGlobalBounds())) { + ship->healUP(); + heartIt = hearts.erase(heartIt); + } else { + ++heartIt; + } + } +} + +void Plansza::check_Meteor_collisions() { + for (auto &meteor: meteors) { + if (ship->getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { + ship->takeDamage(); + } + } +} + ships Plansza::selectedShip = none; unsigned int Plansza::score = 0; \ No newline at end of file