From b1b5858fb6a17118c2870fea786729919626d3a2 Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Mon, 6 Jan 2025 01:31:59 +0100 Subject: [PATCH] =?UTF-8?q?Dziala=20powerup=20na=20pr=C4=99dko=C5=9B=C4=87?= =?UTF-8?q?=20poruszania=20si=C4=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/img/powerups/PUSpeed.png | Bin 0 -> 7201 bytes headers/Heart.hpp | 2 +- headers/ObjectItem.hpp | 1 + headers/Plansza.h | 6 +++ headers/PowerUp.h | 6 ++- sources/Heart.cpp | 7 +--- sources/Meteor.cpp | 1 - sources/ObjectItem.cpp | 1 + sources/Plansza.cpp | 68 +++++++++++++++++++++++--------- sources/PowerUp.cpp | 21 +++++++++- 10 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 assets/img/powerups/PUSpeed.png diff --git a/assets/img/powerups/PUSpeed.png b/assets/img/powerups/PUSpeed.png new file mode 100644 index 0000000000000000000000000000000000000000..28fb1d6ce2d9c55d1d33ec7b54f19851786431eb GIT binary patch literal 7201 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 &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ą + } +}