diff --git a/assets/img/powerups/PUSpeed.png b/assets/img/powerups/PUSpeed.png new file mode 100644 index 0000000..28fb1d6 Binary files /dev/null and b/assets/img/powerups/PUSpeed.png differ diff --git a/headers/Heart.hpp b/headers/Heart.hpp index 14c785c..213e475 100644 --- a/headers/Heart.hpp +++ b/headers/Heart.hpp @@ -6,7 +6,7 @@ class Heart : public ObjectItem { public: - Heart(float x, float y, sf::Texture &texture); + Heart(float x, float y, sf::Texture &texture_); void update() override; }; diff --git a/headers/ObjectItem.hpp b/headers/ObjectItem.hpp index bfcdaee..f87d194 100644 --- a/headers/ObjectItem.hpp +++ b/headers/ObjectItem.hpp @@ -7,6 +7,7 @@ class ObjectItem { public: + virtual ~ObjectItem() = default; ObjectItem(float x, float y, sf::Texture &texture); sf::Sprite &getSprite(); bool getStatus(); diff --git a/headers/Plansza.h b/headers/Plansza.h index d1698ba..cabfc34 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -15,6 +15,7 @@ #include "AudioManager.h" #include "Plansza.h" #include "Heart.hpp" +#include "PowerUp.h" #include "Size.h" enum ships{ @@ -31,8 +32,10 @@ public: std::vector &getMeteors(); void spawn_meteor(); void spawn_hearts(); + void spawn_power_up(); void update_meteors(); void update_hearts(); + void update_power_ups(); void update(); void update_score(); void spawn_player(); @@ -56,6 +59,7 @@ private: sf::Font font; sf::Clock meteorSpawnClock; sf::Clock heartSpawnClock; + sf::Clock powerUpSpawnClock; sf::Clock spawnClock; sf::Clock scoreClock; sf::Clock shooterSpawnClock; @@ -79,6 +83,7 @@ private: sf::Texture meteorTexture2; sf::Texture heartTexture; sf::Texture heartTextureGray; + sf::Texture powerUpTexture; std::vector enemies; std::vector AEnemies; std::vector BEnemies; @@ -87,6 +92,7 @@ private: std::vector meteors; std::vector hearts; std::vector heartStats; + std::vector powerUps; bool gameOver = false; }; diff --git a/headers/PowerUp.h b/headers/PowerUp.h index fcf53dd..1766186 100644 --- a/headers/PowerUp.h +++ b/headers/PowerUp.h @@ -2,8 +2,10 @@ #define POWERUP_H #include "ObjectItem.hpp" -class PowerUp : ObjectItem { - +class PowerUp : public ObjectItem { +public: + PowerUp(float x, float y, sf::Texture &texture_); + void update() override; }; #endif //POWERUP_H diff --git a/sources/Heart.cpp b/sources/Heart.cpp index 4a61998..d1c295c 100644 --- a/sources/Heart.cpp +++ b/sources/Heart.cpp @@ -1,13 +1,11 @@ #include "../headers/Heart.hpp" Heart::Heart(float x, float y, sf::Texture &texture) : ObjectItem(x,y,texture) { - outOfBounds = false; - texture = texture; - sprite.setTexture(texture); + texture_ = texture; + sprite.setTexture(texture_); sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite sprite.setPosition(x, y); movingSpeed = 3.0f; -// sprite.scale(0.05f, 0.05f); position.x = x; position.y = y; rotationSpeed = 0; @@ -16,7 +14,6 @@ Heart::Heart(float x, float y, sf::Texture &texture) : ObjectItem(x,y,texture) { void Heart::update() { sprite.move(0.0f, movingSpeed); // przesunięcie sprajta position.y += int(movingSpeed); // przesunięcie pozycji -// sprite.rotate(rotationSpeed); // obracanie tym meteorkiem pięknym if(position.y > 900) { outOfBounds = true; // jeżeli wyszedł poza granice ekranu ustaw tą zmienną } diff --git a/sources/Meteor.cpp b/sources/Meteor.cpp index edbe41e..5bbe384 100644 --- a/sources/Meteor.cpp +++ b/sources/Meteor.cpp @@ -1,7 +1,6 @@ #include "../headers/Meteor.h" Meteor::Meteor(float x, float y, sf::Texture &texture) : ObjectItem(x, y, texture) { - outOfBounds = false; texture_ = texture; sprite.setTexture(texture); sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite diff --git a/sources/ObjectItem.cpp b/sources/ObjectItem.cpp index 4d80017..0023578 100644 --- a/sources/ObjectItem.cpp +++ b/sources/ObjectItem.cpp @@ -1,6 +1,7 @@ #include "../headers/ObjectItem.hpp" ObjectItem::ObjectItem(float x, float y, sf::Texture &texture) { + outOfBounds = false; Position position_ = {0,0}; position_.x = static_cast(x); position_.y = static_cast(y); diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 2e423c5..a324b79 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -21,8 +21,12 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render } else { playerTexture.loadFromFile("../assets/ship/Dreadnought-Base.png"); } + // Ładowanie tekstur itemów meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); + heartTexture.loadFromFile("../assets/img/hearts/heart.png"); + heartTextureGray.loadFromFile("../assets/img/hearts/heart_gray.png"); + powerUpTexture.loadFromFile("../assets/img/powerups/PUSpeed.png"); // Ładowanie tekstur wrogów enemyTexture.loadFromFile("../assets/img/enemy/enemy.png"); advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png"); @@ -50,12 +54,6 @@ 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"); - meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); - meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); - - heartTexture.loadFromFile("../assets/img/hearts/heart.png"); - heartTextureGray.loadFromFile("../assets/img/hearts/heart_gray.png"); - heartStats.emplace_back(heartTexture); heartStats.emplace_back(heartTexture); heartStats.emplace_back(heartTexture); @@ -64,6 +62,7 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render heartStats[2].setPosition(495, 10); meteorSpawnClock.restart(); + powerUpSpawnClock.restart(); spawn_player(); spawnClock.restart(); @@ -111,13 +110,14 @@ void Plansza::update() { ship->update(); // migotanie statku update_score(); // naliczanie punktów // Sprawnowanie wszystkich rodzajów wrogów - spawn_meteor(); - spawn_hearts(); - spawn_enemy(); - spawn_advanced_enemy(); - spawn_wiazkowiec(); - spawn_bomber(); - spawn_kamikadze(); + // spawn_meteor(); + // spawn_hearts(); + spawn_power_up(); + // spawn_enemy(); + // spawn_advanced_enemy(); + // spawn_wiazkowiec(); + // spawn_bomber(); + // spawn_kamikadze(); // utrzymanie meteorów i pocisków w ruchu for (auto &meteor: meteors) { @@ -130,6 +130,11 @@ void Plansza::update() { window->draw(heart.getSprite()); } + for (auto &powerUp: powerUps) { + powerUp.update(); + window->draw(powerUp.getSprite()); + } + for (auto &bullet: ship->getBullets()) { bullet.update(); window->draw(bullet.getSprite()); @@ -162,6 +167,16 @@ void Plansza::update() { } } + // TODO: Dodać obsługę kilku różnych power-upów + for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) { + if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) { + ship->setMovingSpeed(10.0f); + powerUpIt = powerUps.erase(powerUpIt); + } else { + ++powerUpIt; + } + } + for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { bool meteorHit = false; for (auto rocketIt = ship->getBullets().begin(); rocketIt != ship->getBullets().end();) { @@ -706,6 +721,23 @@ void Plansza::update_meteors() { } } +void Plansza::update_hearts() { + // usuwanie serduszek, które wyleciały poza ekran + for (auto& heart : hearts) { + if(heart.getStatus()) { + hearts.erase(hearts.begin()); + } + } +} + +void Plansza::update_power_ups() { + for (auto& power : powerUps) { + if(power.getStatus()) { + powerUps.erase(powerUps.begin()); + } + } +} + 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 @@ -728,12 +760,12 @@ void Plansza::spawn_hearts() { } } -void Plansza::update_hearts() { - // usuwanie serduszek, które wyleciały poza ekran - for (auto& heart : hearts) { - if(heart.getStatus()) { - hearts.erase(hearts.begin()); +void Plansza::spawn_power_up() { + if (powerUpSpawnClock.getElapsedTime().asSeconds() > 5) { + if (powerUps.size() < 2) { + powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, powerUpTexture); } + powerUpSpawnClock.restart(); } } diff --git a/sources/PowerUp.cpp b/sources/PowerUp.cpp index 85f39fa..c0e62fe 100644 --- a/sources/PowerUp.cpp +++ b/sources/PowerUp.cpp @@ -1 +1,20 @@ -#include "../headers/PowerUp.h" \ No newline at end of file +#include "../headers/PowerUp.h" + +PowerUp::PowerUp(float x, float y, sf::Texture &texture): ObjectItem(x, y, texture) { + position.x = x; + position.y = y; + texture_ = texture; + sprite.setTexture(texture); + sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite + sprite.setScale(0.5f, 0.5f); + sprite.setPosition(x, y); + movingSpeed = 3.0f; +} + +void PowerUp::update() { + sprite.move(0.0f, movingSpeed); // przesunięcie sprajta + position.y += int(movingSpeed); // przesunięcie pozycji + if(position.y > 900) { + outOfBounds = true; // jeżeli wyszedł poza granice ekranu ustaw tą zmienną + } +}