From 71f8ebe285bb662c881b582cfb2f306a4d3e439b Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Fri, 6 Dec 2024 15:16:57 +0100 Subject: [PATCH] Statek miga przy uderzeniu w meteoryt --- headers/Player.h | 5 +++++ sources/Actor.cpp | 2 +- sources/Plansza.cpp | 3 ++- sources/Player.cpp | 22 ++++++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/headers/Player.h b/headers/Player.h index e6b4c01..d466f17 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -17,12 +17,17 @@ public: void moveRight() override; void moveUp() override; void moveDown() override; + void onHit(); + void update(); std::vector& getRockets(); private: std::chrono::steady_clock::time_point lastShotTime = std::chrono::steady_clock::now(); std::vector rockets; sf::Texture rocketTexture; sf::Texture bulletTexture; + bool isBlinking = false; + sf::Color originalColor; + }; diff --git a/sources/Actor.cpp b/sources/Actor.cpp index 9a3daf5..429c459 100644 --- a/sources/Actor.cpp +++ b/sources/Actor.cpp @@ -29,7 +29,7 @@ unsigned int Actor::getHP() { } void Actor::dealDamage() { - if(damageDealClock.getElapsedTime().asSeconds() > 1) { + if(damageDealClock.getElapsedTime().asSeconds() > 1.5) { if(hp > 0) { hp--; } diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 5ca9831..0708094 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -105,13 +105,14 @@ void Plansza::update() { update_hearts(); ship.updateBullets(); + ship.update(); window->draw(ship.getSprite()); // trochę dziwny sposób ale jednak działa for (auto &meteor: meteors) { if (ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { - ship.dealDamage(); + ship.onHit(); } } diff --git a/sources/Player.cpp b/sources/Player.cpp index 12582e5..c26eba8 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -7,6 +7,7 @@ Player::Player(int x, int y, std::string path) : Actor(x, y, std::move(path)) { rocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png"); hp = 3; damageDealClock.restart(); + originalColor = actorSprite.getColor(); }; void Player::shoot() { @@ -25,6 +26,27 @@ void Player::alternate_shoot() { } } +void Player::onHit() { + dealDamage(); + isBlinking = true; +} + +void Player::update() { + if (isBlinking) { + auto elapsed = damageDealClock.getElapsedTime().asMilliseconds(); + if (elapsed < 1000) { // miganie przez 1 sekundę + if ((elapsed / 100) % 2 == 0) { + actorSprite.setColor(sf::Color(255, 255, 255, 128)); // półprzeźroczysty + } else { + actorSprite.setColor(originalColor); // oryginalny kolor + } + } else { + isBlinking = false; + actorSprite.setColor(originalColor); // przywróć oryginalny kolor + } + } +} + void Player::setFirerate(unsigned int firerate) { this->firerate = firerate; }