diff --git a/assets/img/powerups/TripleShotPU.png b/assets/img/powerups/TripleShotPU.png new file mode 100644 index 0000000..c3fa917 Binary files /dev/null and b/assets/img/powerups/TripleShotPU.png differ diff --git a/assets/img/powerups/fireratePU.png b/assets/img/powerups/fireratePU.png new file mode 100644 index 0000000..de83337 Binary files /dev/null and b/assets/img/powerups/fireratePU.png differ diff --git a/assets/img/powerups/PUSpeed.png b/assets/img/powerups/movingSpeedPU.png similarity index 100% rename from assets/img/powerups/PUSpeed.png rename to assets/img/powerups/movingSpeedPU.png diff --git a/headers/Plansza.h b/headers/Plansza.h index cabfc34..5b6ae1e 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -60,6 +60,9 @@ private: sf::Clock meteorSpawnClock; sf::Clock heartSpawnClock; sf::Clock powerUpSpawnClock; + sf::Clock movingSpeedPUTimer; + sf::Clock fireratePUTimer; + sf::Clock tripleShotPUTimer; sf::Clock spawnClock; sf::Clock scoreClock; sf::Clock shooterSpawnClock; @@ -83,7 +86,9 @@ private: sf::Texture meteorTexture2; sf::Texture heartTexture; sf::Texture heartTextureGray; - sf::Texture powerUpTexture; + sf::Texture movingSpeedPowerUpTexture; + sf::Texture fireratePowerUpTexture; + sf::Texture tripleShotPowerUpTexture; std::vector enemies; std::vector AEnemies; std::vector BEnemies; diff --git a/headers/Player.h b/headers/Player.h index 0e4823e..6c4ab63 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -29,6 +29,7 @@ public: void moveUp() override; void moveDown() override; void takeDamage(); + void setTripleShot(bool toogle); void update(); std::vector& getRockets(); @@ -44,6 +45,7 @@ private: sf::Clock immortalityClock; // Zegar kontrolujący czas nieśmiertelności float immortalityDuration = 1.5f; // Czas trwania nieśmiertelności w sec bool isImmortal = false; // flaga na immortal + bool tripleShot = false; // flaga na potrójny strzał }; diff --git a/headers/PowerUp.h b/headers/PowerUp.h index 1766186..e6f5d1d 100644 --- a/headers/PowerUp.h +++ b/headers/PowerUp.h @@ -4,8 +4,22 @@ class PowerUp : public ObjectItem { public: - PowerUp(float x, float y, sf::Texture &texture_); + enum Type { + movingSpeedUp, + firerateUp, + tripleShotUp + }; + + PowerUp(float x, float y, sf::Texture &texture, Type type); + void update() override; + + Type getType() const { + return type_; + } + +private: + Type type_; }; #endif //POWERUP_H diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index a324b79..403bac0 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -26,7 +26,9 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render 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"); + movingSpeedPowerUpTexture.loadFromFile("../assets/img/powerups/movingSpeedPU.png"); + fireratePowerUpTexture.loadFromFile("../assets/img/powerups/fireratePU.png"); + tripleShotPowerUpTexture.loadFromFile("../assets/img/powerups/TripleShotPU.png"); // Ładowanie tekstur wrogów enemyTexture.loadFromFile("../assets/img/enemy/enemy.png"); advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png"); @@ -70,7 +72,8 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render // TODO: Refactor tej metody bo rozrosła się za bardzo już void Plansza::update() { -// tło + srand(time(0)); + // tło background.update(); background.draw(*window); @@ -99,11 +102,11 @@ void Plansza::update() { // TODO: Przenieść obiekt dźwięku wewnątrz klasy Bullet if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { ship->shoot(); - audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału + // audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału } if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { ship->alternate_shoot(); - audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału + // audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału } // generowanie nowego meteoru @@ -148,6 +151,7 @@ void Plansza::update() { // Sprawdzenie, czy meteory i pociski są poza granicami ekranu update_meteors(); update_hearts(); + update_power_ups(); ship->updateBullets(); window->draw(ship->getSprite()); @@ -168,15 +172,41 @@ void Plansza::update() { } // 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())) { - ship->setMovingSpeed(10.0f); + 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; } } + 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); + } + ///////////////////////////////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();) { @@ -763,7 +793,19 @@ void Plansza::spawn_hearts() { void Plansza::spawn_power_up() { if (powerUpSpawnClock.getElapsedTime().asSeconds() > 5) { if (powerUps.size() < 2) { - powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, powerUpTexture); + auto powerUpRand = rand() % 3; + switch (powerUpRand) { + case 0: + powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, movingSpeedPowerUpTexture, PowerUp::movingSpeedUp); + break; + case 1: + powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, fireratePowerUpTexture, PowerUp::firerateUp); + break; + case 2: + powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50,499), -100, tripleShotPowerUpTexture, PowerUp::tripleShotUp); + } + + } powerUpSpawnClock.restart(); } @@ -836,7 +878,6 @@ std::vector &Plansza::getMeteors() { return meteors; } -// TODO: naliczanie punktów za zabicie wrogów void Plansza::update_score() { if (scoreClock.getElapsedTime().asMilliseconds() > 500) { score++; diff --git a/sources/Player.cpp b/sources/Player.cpp index 7170b2f..26e505e 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -36,8 +36,16 @@ void Player::loadTexture() { void Player::shoot() { auto now = std::chrono::steady_clock::now(); if (std::chrono::duration_cast(now - lastShotTime).count() >= firerate) { - bullets.emplace_back(position.x, position.y, bulletTexture); - lastShotTime = now; + 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); + lastShotTime = now; + } + if (tripleShot == false) { + bullets.emplace_back(position.x, position.y, bulletTexture); + lastShotTime = now; + } } } @@ -79,6 +87,10 @@ void Player::takeDamage() { } } +void Player::setTripleShot(bool toogle) { + tripleShot = toogle; +} + void Player::setFirerate(unsigned int firerate) { this->firerate = firerate; } diff --git a/sources/PowerUp.cpp b/sources/PowerUp.cpp index c0e62fe..a8e3ff8 100644 --- a/sources/PowerUp.cpp +++ b/sources/PowerUp.cpp @@ -1,6 +1,6 @@ #include "../headers/PowerUp.h" -PowerUp::PowerUp(float x, float y, sf::Texture &texture): ObjectItem(x, y, texture) { +PowerUp::PowerUp(float x, float y, sf::Texture &texture, PowerUp::Type type): ObjectItem(x, y, texture) { position.x = x; position.y = y; texture_ = texture; @@ -9,6 +9,7 @@ PowerUp::PowerUp(float x, float y, sf::Texture &texture): ObjectItem(x, y, textu sprite.setScale(0.5f, 0.5f); sprite.setPosition(x, y); movingSpeed = 3.0f; + this->type_ = type; } void PowerUp::update() {