From 3d83a3a767f4b46b90b71cb1922acf4f6edebab6 Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Sun, 5 Jan 2025 18:35:39 +0100 Subject: [PATCH 1/3] powerup init commit --- CMakeLists.txt | 2 ++ headers/PowerUp.h | 9 +++++++++ sources/Plansza.cpp | 38 ++++++++++++++++++-------------------- sources/PowerUp.cpp | 1 + 4 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 headers/PowerUp.h create mode 100644 sources/PowerUp.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a5a910f..67e2d81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,8 @@ add_executable(LotoStatek main.cpp sources/Beam.cpp headers/Heart.hpp sources/Heart.cpp + headers/PowerUp.h + sources/PowerUp.cpp ) if(WIN32) diff --git a/headers/PowerUp.h b/headers/PowerUp.h new file mode 100644 index 0000000..fcf53dd --- /dev/null +++ b/headers/PowerUp.h @@ -0,0 +1,9 @@ +#ifndef POWERUP_H +#define POWERUP_H +#include "ObjectItem.hpp" + +class PowerUp : ObjectItem { + +}; + +#endif //POWERUP_H diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 0e9c294..2e423c5 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -111,13 +111,13 @@ 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_meteor(); + spawn_hearts(); + spawn_enemy(); + spawn_advanced_enemy(); spawn_wiazkowiec(); - // spawn_bomber(); - // spawn_kamikadze(); + spawn_bomber(); + spawn_kamikadze(); // utrzymanie meteorów i pocisków w ruchu for (auto &meteor: meteors) { @@ -697,7 +697,6 @@ void Plansza::update() { } // Meteor-related niżej - void Plansza::update_meteors() { // usuwanie meteorów, które wyleciały poza ekran for (auto &meteor: meteors) { @@ -721,14 +720,23 @@ void Plansza::spawn_meteor() { } void Plansza::spawn_hearts() { - if (heartSpawnClock.getElapsedTime().asSeconds() > rand() % 26 + 5) { // randomowy spawn meteorytów od 5 do 30 sekundy - if (hearts.size() < 5) { // jeśli jest mniej niż 5 meteorów na planszy + if (heartSpawnClock.getElapsedTime().asSeconds() > rand() % 26 + 5) { // randomowy spawn serduszek od 5 do 30 sekundy + if (hearts.size() < 5) { // jeśli jest mniej niż 5 serduszek na planszy hearts.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, heartTexture); } heartSpawnClock.restart(); } } +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_player() { ship = Player::getInstance(static_cast(window->getSize().x) / 2, static_cast(window->getSize().y) - 100, this->playerTexture); ship->loadTexture(); @@ -776,7 +784,7 @@ void Plansza::spawn_kamikadze() { } void Plansza::spawn_wiazkowiec() { - if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 5) { // Spawn co 10 sekund + if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 50) { // Spawn co 10 sekund if (WEnemies.size() < 1) { int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); Wiazkowiec wiazkowiec(spawnX, -50, WiazkowiecTexture, window); @@ -788,16 +796,6 @@ void Plansza::spawn_wiazkowiec() { } } - -void Plansza::update_hearts() { - // usuwanie serduszek, które wyleciały poza ekran - for (auto& heart : hearts) { - if(heart.getStatus()) { - hearts.erase(hearts.begin()); - } - } -} - Size Plansza::getSize() { return size; } diff --git a/sources/PowerUp.cpp b/sources/PowerUp.cpp new file mode 100644 index 0000000..85f39fa --- /dev/null +++ b/sources/PowerUp.cpp @@ -0,0 +1 @@ +#include "../headers/PowerUp.h" \ No newline at end of file From b1b5858fb6a17118c2870fea786729919626d3a2 Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Mon, 6 Jan 2025 01:31:59 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Dziala=20powerup=20na=20pr=C4=99dko=C5=9B?= =?UTF-8?q?=C4=87=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ą + } +} From 4d2283d15e4daa0fcafa3ef0e706819e3d87353f Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Mon, 6 Jan 2025 16:17:38 +0100 Subject: [PATCH 3/3] powerups fully implemented --- assets/img/powerups/TripleShotPU.png | Bin 0 -> 9551 bytes assets/img/powerups/fireratePU.png | Bin 0 -> 2401 bytes .../{PUSpeed.png => movingSpeedPU.png} | Bin headers/Plansza.h | 7 ++- headers/Player.h | 2 + headers/PowerUp.h | 16 ++++- sources/Plansza.cpp | 55 +++++++++++++++--- sources/Player.cpp | 16 ++++- sources/PowerUp.cpp | 3 +- 9 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 assets/img/powerups/TripleShotPU.png create mode 100644 assets/img/powerups/fireratePU.png rename assets/img/powerups/{PUSpeed.png => movingSpeedPU.png} (100%) diff --git a/assets/img/powerups/TripleShotPU.png b/assets/img/powerups/TripleShotPU.png new file mode 100644 index 0000000000000000000000000000000000000000..c3fa917bfd9dcddd978495e4a48c877ffcc3ca17 GIT binary patch literal 9551 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 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() {