From 67f396ae84275b5e269f41f81acb9e0e4b895c4d Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Mon, 13 Jan 2025 15:55:45 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Zaimplementowano=20debuff.=20Do=20doko?= =?UTF-8?q?=C5=84czenia=20resetowanie=20debuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 + assets/img/debuffs/BulletSpeedDBF.png | Bin 0 -> 1440 bytes assets/img/debuffs/firerateDBF.png | Bin 0 -> 2847 bytes assets/img/debuffs/movingSpeedDBF.png | Bin 0 -> 6551 bytes headers/Bullet.h | 5 +- headers/Debuff.h | 24 +++++++ headers/Plansza.h | 30 ++++++-- headers/Player.h | 2 + sources/Bullet.cpp | 6 ++ sources/Debuff.cpp | 21 ++++++ sources/Plansza.cpp | 100 ++++++++++++++++++++++---- sources/Player.cpp | 19 +++-- 12 files changed, 184 insertions(+), 25 deletions(-) create mode 100644 assets/img/debuffs/BulletSpeedDBF.png create mode 100644 assets/img/debuffs/firerateDBF.png create mode 100644 assets/img/debuffs/movingSpeedDBF.png create mode 100644 headers/Debuff.h create mode 100644 sources/Debuff.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 67e2d81..8857b57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,8 @@ add_executable(LotoStatek main.cpp sources/Heart.cpp headers/PowerUp.h sources/PowerUp.cpp + headers/Debuff.h + sources/Debuff.cpp ) if(WIN32) diff --git a/assets/img/debuffs/BulletSpeedDBF.png b/assets/img/debuffs/BulletSpeedDBF.png new file mode 100644 index 0000000000000000000000000000000000000000..be563c24f03e0dd77fed6c3c662f61973b64365e GIT binary patch literal 1440 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 literal 0 HcmV?d00001 diff --git a/assets/img/debuffs/movingSpeedDBF.png b/assets/img/debuffs/movingSpeedDBF.png new file mode 100644 index 0000000000000000000000000000000000000000..5e45d16db102a4d1502fa4284bd3025f899beb95 GIT binary patch literal 6551 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 enemies; std::vector AEnemies; std::vector BEnemies; @@ -105,6 +124,9 @@ private: std::vector hearts; std::vector heartStats; std::vector powerUps; + std::vector debuffs; + + // Zmienne prymitywne bool gameOver = false; }; diff --git a/headers/Player.h b/headers/Player.h index 6c4ab63..a8a99ec 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -30,6 +30,7 @@ public: void moveDown() override; void takeDamage(); void setTripleShot(bool toogle); + void setBulletSpeed(float speed); void update(); std::vector& getRockets(); @@ -44,6 +45,7 @@ private: sf::Color originalColor; sf::Clock immortalityClock; // Zegar kontrolujący czas nieśmiertelności float immortalityDuration = 1.5f; // Czas trwania nieśmiertelności w sec + float bulletSpeed = 10.0f; // prędkość pocisku bool isImmortal = false; // flaga na immortal bool tripleShot = false; // flaga na potrójny strzał }; diff --git a/sources/Bullet.cpp b/sources/Bullet.cpp index 5b766c7..d7dff67 100644 --- a/sources/Bullet.cpp +++ b/sources/Bullet.cpp @@ -1,5 +1,11 @@ #include "../headers/Bullet.h" +Bullet::Bullet(float x, float y, sf::Texture &texture): Projectile(x,y, texture) {} + +Bullet::Bullet(float x, float y, sf::Texture &texture, float speed): Projectile(x,y, texture) { + this->speed = -speed; +} + void Bullet::update() { //std::cout << "Start update: speed = " << speed << ", position.y = " << position.y << std::endl; sprite.move(0.0f, speed); diff --git a/sources/Debuff.cpp b/sources/Debuff.cpp new file mode 100644 index 0000000..cd73f09 --- /dev/null +++ b/sources/Debuff.cpp @@ -0,0 +1,21 @@ +#include "../headers/Debuff.h" + +Debuff::Debuff(float x, float y, sf::Texture &texture, Type type) : 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; + this->type_ = type; +} + +void Debuff::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ą + } +} diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 84b6f5c..e6d151b 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -29,6 +29,9 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render movingSpeedPowerUpTexture.loadFromFile("../assets/img/powerups/movingSpeedPU.png"); fireratePowerUpTexture.loadFromFile("../assets/img/powerups/fireratePU.png"); tripleShotPowerUpTexture.loadFromFile("../assets/img/powerups/TripleShotPU.png"); + movingSpeedDebuffTexture.loadFromFile("../assets/img/debuffs/movingSpeedDBF.png"); + firerateDebuffTexture.loadFromFile("../assets/img/debuffs/firerateDBF.png"); + bulletSpeedDebuffTexture.loadFromFile("../assets/img/debuffs/BulletSpeedDBF.png"); // Ładowanie tekstur wrogów enemyTexture.loadFromFile("../assets/img/enemy/enemy.png"); advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png"); @@ -65,9 +68,10 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render meteorSpawnClock.restart(); powerUpSpawnClock.restart(); + debuffSpawnClock.restart(); spawn_player(); - spawnClock.restart(); + // spawnClock.restart(); } // TODO: Refactor tej metody bo rozrosła się za bardzo już @@ -112,14 +116,15 @@ void Plansza::update() { ship->update(); // migotanie statku update_score(); // naliczanie punktów // Sprawnowanie wszystkich rodzajów wrogów - spawn_meteor(); - spawn_hearts(); - spawn_power_up(); - spawn_enemy(); - spawn_advanced_enemy(); - spawn_wiazkowiec(); - spawn_bomber(); - spawn_kamikadze(); + // spawn_meteor(); + // spawn_hearts(); + // spawn_power_up(); + spawn_debuff(); + // spawn_enemy(); + // spawn_advanced_enemy(); + // spawn_wiazkowiec(); + // spawn_bomber(); + // spawn_kamikadze(); // utrzymanie meteorów i pocisków w ruchu for (auto &meteor: meteors) { @@ -137,6 +142,11 @@ void Plansza::update() { window->draw(powerUp.getSprite()); } + for (auto &debuff: debuffs) { + debuff.update(); + window->draw(debuff.getSprite()); + } + for (auto &bullet: ship->getBullets()) { bullet.update(); window->draw(bullet.getSprite()); @@ -151,6 +161,7 @@ void Plansza::update() { update_meteors(); update_hearts(); update_power_ups(); + update_debuffs(); ship->updateBullets(); window->draw(ship->getSprite()); @@ -158,15 +169,27 @@ void Plansza::update() { check_Meteor_collisions(); check_Heart_collisions(); check_PowerUp_collisions(); + check_Debuff_collisions(); - if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f) { + + // TODO: Dodać flagę aby warunek był sprawdzany nie tylko pod kątem Timeru ale również pod kątem ustawionej flagi + // if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f) { + // ship->setMovingSpeed(8.0f); + // } + // if (fireratePUTimer.getElapsedTime().asSeconds() >= 10.0f ) { + // ship->setFirerate(200); + // } + // if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f) { + // ship->setTripleShot(false); + // } + if (movingSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { ship->setMovingSpeed(8.0f); } - if (fireratePUTimer.getElapsedTime().asSeconds() >= 10.0f) { + if (firerateDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { ship->setFirerate(200); } - if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f) { - ship->setTripleShot(false); + if (bulletSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { + ship->setBulletSpeed(10.0f); } if (gameOver) { @@ -729,6 +752,14 @@ void Plansza::update_power_ups() { } } +void Plansza::update_debuffs() { + for (auto& debuff : debuffs) { + if(debuff.getStatus()) { + debuffs.erase(debuffs.begin()); + } + } +} + void Plansza::spawn_meteor() { 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 @@ -764,6 +795,7 @@ void Plansza::spawn_power_up() { break; case 2: powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50,499), -100, tripleShotPowerUpTexture, PowerUp::tripleShotUp); + break; } @@ -772,6 +804,25 @@ void Plansza::spawn_power_up() { } } +void Plansza::spawn_debuff() { + if (debuffSpawnClock.getElapsedTime().asSeconds() > 5) { + if (debuffs.size() < 1) { + switch (rand() % 3) { + case 0: + debuffs.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, movingSpeedDebuffTexture, Debuff::movingSpeedDbf); + break; + case 1: + debuffs.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, firerateDebuffTexture, Debuff::firerateDbf); + break; + case 2: + debuffs.emplace_back(RandomNumberGenerator::getRandomNumber(50,499), -100, bulletSpeedDebuffTexture, Debuff::bulletSpeedDbf); + break; + } + } + debuffSpawnClock.restart(); + } +} + void Plansza::spawn_player() { ship = Player::getInstance(static_cast(window->getSize().x) / 2, static_cast(window->getSize().y) - 100, this->playerTexture); ship->loadTexture(); @@ -873,6 +924,28 @@ void Plansza::check_PowerUp_collisions() { } } +void Plansza::check_Debuff_collisions() { + for (auto debuffIt = debuffs.begin(); debuffIt != debuffs.end();) { + if (ship->getSprite().getGlobalBounds().intersects(debuffIt->getSprite().getGlobalBounds())) { + if (debuffIt->getType() == Debuff::movingSpeedDbf) { + ship->setMovingSpeed(20.0f); + movingSpeedDebuffTimer.restart(); + } + if (debuffIt->getType() == Debuff::firerateDbf) { + ship->setFirerate(500); + firerateDebuffTimer.restart(); + } + if (debuffIt->getType() == Debuff::bulletSpeedDbf) { + ship->setBulletSpeed(5.0f); + bulletSpeedDebuffTimer.restart(); + } + debuffIt = debuffs.erase(debuffIt); + } else { + ++debuffIt; + } + } +} + void Plansza::check_Heart_collisions() { for (auto heartIt = hearts.begin(); heartIt != hearts.end();) { if (ship->getSprite().getGlobalBounds().intersects(heartIt->getSprite().getGlobalBounds())) { @@ -892,5 +965,6 @@ void Plansza::check_Meteor_collisions() { } } + ships Plansza::selectedShip = none; unsigned int Plansza::score = 0; \ No newline at end of file diff --git a/sources/Player.cpp b/sources/Player.cpp index 26e505e..e9cc08e 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -1,11 +1,11 @@ -#include "../headers/Player.h" - #include #include -#include +#include "../headers/Player.h" #include "../headers/Plansza.h" + + Player::Player(int x, int y, const sf::Texture& texture) : Actor(x, y, texture) { hp = 3; if(Plansza::selectedShip != none) { @@ -37,13 +37,13 @@ void Player::shoot() { auto now = std::chrono::steady_clock::now(); if (std::chrono::duration_cast(now - lastShotTime).count() >= firerate) { if (tripleShot == true) { - bullets.emplace_back(position.x - 40, position.y, bulletTexture); - bullets.emplace_back(position.x, position.y, bulletTexture); - bullets.emplace_back(position.x + 40, position.y, bulletTexture); + bullets.emplace_back(position.x - 40, position.y, bulletTexture, bulletSpeed); + bullets.emplace_back(position.x, position.y, bulletTexture, bulletSpeed); + bullets.emplace_back(position.x + 40, position.y, bulletTexture, bulletSpeed); lastShotTime = now; } if (tripleShot == false) { - bullets.emplace_back(position.x, position.y, bulletTexture); + bullets.emplace_back(position.x, position.y, bulletTexture, bulletSpeed); lastShotTime = now; } } @@ -123,4 +123,9 @@ std::vector &Player::getRockets() { return rockets; } +void Player::setBulletSpeed(float speed) { + this->bulletSpeed = speed; +} + + Player* Player::player_ = nullptr; From 7a808d46a6e556cc601ded13ed63b7cc688668ab Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Mon, 13 Jan 2025 23:24:43 +0100 Subject: [PATCH 2/2] Debuffs fully implemented --- headers/Plansza.h | 10 ++++++++++ sources/Plansza.cpp | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/headers/Plansza.h b/headers/Plansza.h index 1952ba3..aeb0739 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -128,6 +128,16 @@ private: // Zmienne prymitywne bool gameOver = false; + struct { + bool movingSpeed = false; + bool firerate = false; + bool tripleShot = false; + } powerUpCollected; + struct { + bool movingSpeed = false; + bool firerate = false; + bool bulletSpeed = false; + } debuffCollected; }; #endif //PLANSZA_H diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index e6d151b..2ff27ef 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -118,7 +118,7 @@ void Plansza::update() { // Sprawnowanie wszystkich rodzajów wrogów // spawn_meteor(); // spawn_hearts(); - // spawn_power_up(); + spawn_power_up(); spawn_debuff(); // spawn_enemy(); // spawn_advanced_enemy(); @@ -173,22 +173,28 @@ void Plansza::update() { // TODO: Dodać flagę aby warunek był sprawdzany nie tylko pod kątem Timeru ale również pod kątem ustawionej flagi - // if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f) { - // ship->setMovingSpeed(8.0f); - // } - // if (fireratePUTimer.getElapsedTime().asSeconds() >= 10.0f ) { - // ship->setFirerate(200); - // } - // if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f) { - // ship->setTripleShot(false); - // } - if (movingSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { + if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f && powerUpCollected.movingSpeed) { + powerUpCollected.movingSpeed = false; ship->setMovingSpeed(8.0f); } - if (firerateDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { + if (fireratePUTimer.getElapsedTime().asSeconds() >= 10.0f && powerUpCollected.firerate) { + powerUpCollected.firerate = false; ship->setFirerate(200); } - if (bulletSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f) { + if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f && powerUpCollected.tripleShot) { + powerUpCollected.tripleShot = false; + ship->setTripleShot(false); + } + if (movingSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f && debuffCollected.movingSpeed) { + debuffCollected.movingSpeed = false; + ship->setMovingSpeed(8.0f); + } + if (firerateDebuffTimer.getElapsedTime().asSeconds() >= 5.0f && debuffCollected.firerate) { + debuffCollected.firerate = false; + ship->setFirerate(200); + } + if (bulletSpeedDebuffTimer.getElapsedTime().asSeconds() >= 5.0f && debuffCollected.bulletSpeed) { + debuffCollected.bulletSpeed = false; ship->setBulletSpeed(10.0f); } @@ -907,14 +913,17 @@ void Plansza::check_PowerUp_collisions() { if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) { if (powerUpIt->getType() == PowerUp::movingSpeedUp) { ship->setMovingSpeed(15.0f); + powerUpCollected.movingSpeed = true; movingSpeedPUTimer.restart(); } if (powerUpIt->getType() == PowerUp::firerateUp) { ship->setFirerate(100); + powerUpCollected.firerate = true; fireratePUTimer.restart(); } if (powerUpIt->getType() == PowerUp::tripleShotUp) { ship->setTripleShot(true); + powerUpCollected.tripleShot = true; tripleShotPUTimer.restart(); } powerUpIt = powerUps.erase(powerUpIt); @@ -928,15 +937,18 @@ void Plansza::check_Debuff_collisions() { for (auto debuffIt = debuffs.begin(); debuffIt != debuffs.end();) { if (ship->getSprite().getGlobalBounds().intersects(debuffIt->getSprite().getGlobalBounds())) { if (debuffIt->getType() == Debuff::movingSpeedDbf) { - ship->setMovingSpeed(20.0f); + ship->setMovingSpeed(4.0f); + debuffCollected.movingSpeed = true; movingSpeedDebuffTimer.restart(); } if (debuffIt->getType() == Debuff::firerateDbf) { ship->setFirerate(500); + debuffCollected.firerate = true; firerateDebuffTimer.restart(); } if (debuffIt->getType() == Debuff::bulletSpeedDbf) { ship->setBulletSpeed(5.0f); + debuffCollected.bulletSpeed = true; bulletSpeedDebuffTimer.restart(); } debuffIt = debuffs.erase(debuffIt);