diff --git a/headers/Actor.h b/headers/Actor.h index fe05f3a..7b26426 100644 --- a/headers/Actor.h +++ b/headers/Actor.h @@ -11,12 +11,6 @@ class Actor { public: Actor(int x, int y, const sf::Texture& texture); - void loadTexture(std::string path); - - sf::Sprite& getSprite(); - - Position getPosition(); - virtual void move(float deltaX, float deltaY) = 0; virtual void moveLeft() = 0; virtual void moveRight() = 0; @@ -25,22 +19,24 @@ public: virtual void shoot() = 0; std::vector& getBullets(); - - void updateBullets(); + sf::Sprite& getSprite(); + Position getPosition(); void setMovingSpeed(float speed); + void updateBullets(); + protected: + Position position; sf::Sprite actorSprite; sf::Texture actorTexture; - sf::Texture bulletTextureLeft; - sf::Texture bulletTextureRight; - Position position; + sf::Texture bulletTexture; + sf::Texture rocketTexture; + std::vector bullets; unsigned int hp; unsigned int damage; unsigned int firerate; float moving_speed; - std::vector bullets; }; #endif //ACTOR_H diff --git a/headers/Plansza.h b/headers/Plansza.h index 96f7f3d..7379d8a 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -18,25 +18,30 @@ class Plansza { public: - Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow, - const sf::Texture& playerTexture, const sf::Texture& playerBulletTexture, const sf::Texture& playerRocketTexture); + Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow); Size getSize(); std::vector &getMeteors(); void spawn_meteor(); void update_meteors(); void update(); void update_score(); - void spawn_enemy(); void setOutOfBounds(bool status); + void spawn_player(); + void spawn_enemy(); void spawn_advanced_enemy(); void spawn_wiazkowiec(); void spawn_bomber(); void spawn_kamikadze(); + ~Plansza() { + delete ship; // usuwanie wskaźnika ship + } private: Size size; Background background; - Player ship; AudioManager audioManager; + Player *ship; + sf::RenderWindow *window; + sf::Font font; sf::Texture meteorTexture1; sf::Texture meteorTexture2; sf::Texture enemyBulletTexture; @@ -53,20 +58,19 @@ private: sf::Clock spawnClock; sf::Clock scoreClock; sf::Clock shooterSpawnClock; - std::vector enemies; - std::vector AEnemies; - std::vector BEnemies; - std::vector KEnemies; - std::vector WEnemies; sf::Clock enemySpawnClock; sf::Clock AenemySpawnClock; sf::Clock BomberSpawnClock; sf::Clock KamikadzeSpawnClock; sf::Clock WiazkowiecSpawnClock; + std::vector enemies; + std::vector AEnemies; + std::vector BEnemies; + std::vector KEnemies; + std::vector WEnemies; std::vector meteors; - sf::RenderWindow *window; - sf::Font font; unsigned int score = 0; + bool isPlayerSpawned = false; }; #endif //PLANSZA_H diff --git a/headers/Player.h b/headers/Player.h index ba7e0b5..6698580 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -1,7 +1,6 @@ #ifndef LOTOSTATEK_PLAYER_H #define LOTOSTATEK_PLAYER_H - #include #include @@ -9,9 +8,17 @@ #include "Rocket.h" class Player : public Actor { + // Zgodnie z refactoring.guru singleton pattern + // https://refactoring.guru/design-patterns/singleton/cpp/example +protected: + Player(int x, int y, const sf::Texture &texture); + static Player* player_; public: - Player(int x, int y, const sf::Texture& texture, const sf::Texture& bulletTexture, const sf::Texture& rocketTexture); - void setTextures(const sf::Texture& shipTexture, const sf::Texture& bulletTexture, const sf::Texture& rocketTexture); + Player(Player &other) = delete; + void operator=(const Player &) = delete; + static Player* getInstance(int x, int y, const sf::Texture &texture); + // Tu się kończy definicja singletona + void shoot() override; void alternate_shoot(); void setFirerate(unsigned int firerate); @@ -24,6 +31,9 @@ public: bool isAlive() const; void update(); std::vector& getRockets(); + + void loadTexture(); + private: std::chrono::steady_clock::time_point lastShotTime = std::chrono::steady_clock::now(); std::vector rockets; diff --git a/main.cpp b/main.cpp index 6c612bc..61d9cb0 100644 --- a/main.cpp +++ b/main.cpp @@ -3,16 +3,8 @@ #include "headers/Plansza.h" -int main() -{ +int main() { std::clog << "Game started\n"; - sf::Texture playerTexture, playerBulletTexture, playerRocketTexture; - if (!playerTexture.loadFromFile("../assets/ship/Dreadnought-Base.png") || - !playerBulletTexture.loadFromFile("../assets/img/bullets/bullet_pink.png") || - !playerRocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png")) { - std::cerr << "Failed to load player textures!" << std::endl; - return -1; - } sf::RenderWindow mainWindow(sf::VideoMode(600, 800), "LotoStatek"); mainWindow.setVerticalSyncEnabled(true); mainWindow.setFramerateLimit(60); @@ -22,8 +14,7 @@ int main() mainWindow.setIcon(128, 128, icon.getPixelsPtr()); - - Plansza plansza(mainWindow.getSize().y, mainWindow.getSize().x, &mainWindow,playerTexture, playerBulletTexture, playerRocketTexture); + Plansza plansza(mainWindow.getSize().y, mainWindow.getSize().x, &mainWindow); while (mainWindow.isOpen()) { mainWindow.clear(); @@ -31,7 +22,7 @@ int main() // Tu są handlowane eventy sf::Event event{}; while (mainWindow.pollEvent(event)) { - if(event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) + if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) mainWindow.close(); } diff --git a/sources/Actor.cpp b/sources/Actor.cpp index 5770cbd..74535fb 100644 --- a/sources/Actor.cpp +++ b/sources/Actor.cpp @@ -10,14 +10,6 @@ Actor::Actor(int x, int y, const sf::Texture& texture) { actorSprite.setPosition(float(x), float(y)); } -void Actor::loadTexture(std::string path) { - actorTexture.loadFromFile(path); - actorSprite.setTexture(actorTexture); - - bulletTextureLeft.loadFromFile("../assets/img/bullets/bullet_pink.png"); - bulletTextureRight.loadFromFile("../assets/img/rockets/Rocket_111.png"); -} - sf::Sprite &Actor::getSprite() { if (!actorSprite.getTexture()) { std::cerr << "actorSprite has no texture set!" << std::endl; diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 4baa5d8..1dba665 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -1,39 +1,16 @@ #include #include #include "../headers/Plansza.h" -#include "../headers/ObjectItem.hpp" #include "../headers/RandomNumberGenerator.h" -Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow, - const sf::Texture &playerTexture, - const sf::Texture &playerBulletTexture, - const sf::Texture &playerRocketTexture) - : background("../assets/img/background/background.png", 2.0f), - ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow->getSize().y) - 100, - playerTexture, playerBulletTexture, playerRocketTexture) { +Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow) + : background("../assets/img/background/background.png", 2.0f) { window = mainWindow; size.height = static_cast(windowHeight); size.width = static_cast(windowWidth); - score = 0; - - // Wczytywanie czcionki dla licznika punktów - if (!font.loadFromFile("../assets/fonts/arial.ttf")) { - std::cerr << "Error loading font\n"; - exit(-500); - } - - ship.setMovingSpeed(8); - ship.setFirerate(200); - - audioManager.loadBackgroundMusic("../assets/music/background.ogg"); - audioManager.playBackgroundMusic(); - - audioManager.loadSoundEffect("shoot", "../assets/sounds/shoot.ogg"); - audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg"); - audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3"); - try { + playerTexture.loadFromFile("../assets/ship/Dreadnought-Base.png"); meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); // Ładowanie tekstur wrogów @@ -48,6 +25,23 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render exit(-500); } + score = 0; + + // Wczytywanie czcionki dla licznika punktów + if (!font.loadFromFile("../assets/fonts/arial.ttf")) { + std::cerr << "Error loading font\n"; + exit(-500); + } + + audioManager.loadBackgroundMusic("../assets/music/background.ogg"); + audioManager.playBackgroundMusic(); + + audioManager.loadSoundEffect("shoot", "../assets/sounds/shoot.ogg"); + audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg"); + audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3"); + + spawn_player(); + spawnClock.restart(); } @@ -59,38 +53,38 @@ void Plansza::update() { // poruszanie się statkiem if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { - if (ship.getPosition().x > 50) { - ship.moveLeft(); + if (ship->getPosition().x > 50) { + ship->moveLeft(); } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { - if (ship.getPosition().y > 80) { - ship.moveUp(); + if (ship->getPosition().y > 80) { + ship->moveUp(); } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { - if (ship.getPosition().y < 720) { - ship.moveDown(); + if (ship->getPosition().y < 720) { + ship->moveDown(); } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { - if (ship.getPosition().x < 550) { - ship.moveRight(); + if (ship->getPosition().x < 550) { + ship->moveRight(); } } // TODO: Przenieść obiekt dźwięku wewnątrz klasy Bullet if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { - ship.shoot(); + ship->shoot(); audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału } if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { - ship.alternate_shoot(); + ship->alternate_shoot(); audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału } // generowanie nowego meteoru - ship.update(); // migotanie statku + ship->update(); // migotanie statku update_score(); // naliczanie punktów // Sprawnowanie wszystkich rodzajów wrogów spawn_meteor(); @@ -106,29 +100,29 @@ void Plansza::update() { window->draw(meteor.getSprite()); } - for (auto &bullet: ship.getBullets()) { + for (auto &bullet: ship->getBullets()) { bullet.update(); window->draw(bullet.getSprite()); } - for (auto &rocket: ship.getRockets()) { + for (auto &rocket: ship->getRockets()) { rocket.update(); window->draw(rocket.getSprite()); } // Sprawdzenie czy meteory i pociski są poza granicami ekranu update_meteors(); - ship.updateBullets(); + ship->updateBullets(); - window->draw(ship.getSprite()); + window->draw(ship->getSprite()); for (auto &meteor: getMeteors()) { - if (ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { - ship.takeDamage(); + if (ship->getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) { + ship->takeDamage(); } } - if (!ship.isAlive()) { + if (!ship->isAlive()) { sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end"); sf::Font font; if (!font.loadFromFile("../assets/fonts/arial.ttf")) { @@ -159,9 +153,9 @@ void Plansza::update() { for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { bool meteorHit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (meteorIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - ship.getBullets().erase(bulletIt); + ship->getBullets().erase(bulletIt); meteorIt = getMeteors().erase(meteorIt); meteorHit = true; break; @@ -176,9 +170,9 @@ void Plansza::update() { for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { bool meteorHit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - ship.getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); meteorIt = getMeteors().erase(meteorIt); meteorHit = true; break; @@ -235,16 +229,16 @@ void Plansza::update() { for (auto it = KEnemies.begin(); it != KEnemies.end();) { - sf::Vector2f playerPosition = ship.getSprite().getPosition(); // Aktualna pozycja gracza + sf::Vector2f playerPosition = ship->getSprite().getPosition(); // Aktualna pozycja gracza bool playerHit = false; it->update(playerPosition); // Wybuch, gdy Kamikadze dotknie gracza - if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + if (ship->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { it->explode(playerPosition, playerHit); if (playerHit) { - ship.takeDamage(); // Gracz otrzymuje obrażenia + ship->takeDamage(); // Gracz otrzymuje obrażenia std::cout << "Gracz został trafiony przez eksplozję Kamikadze!" << std::endl; } } @@ -268,8 +262,8 @@ void Plansza::update() { // Obsługa pocisków zaawansowanych przeciwników for (auto &aEnemy: AEnemies) { for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { - if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { - ship.takeDamage(); // Zadanie obrażeń graczowi + if (ship->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + ship->takeDamage(); // Zadanie obrażeń graczowi it = aEnemy.getBullets().erase(it); // Usuwanie pocisku po trafieniu } else { ++it; @@ -280,8 +274,8 @@ void Plansza::update() { // Obsługa bomb for (auto &aEnemy: BEnemies) { for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { - if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { - ship.takeDamage(); // Zadanie obrażeń graczowi + if (ship->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + ship->takeDamage(); // Zadanie obrażeń graczowi it = aEnemy.getBullets().erase(it); // Usuwanie pocisku po trafieniu } else { ++it; @@ -317,9 +311,9 @@ void Plansza::update() { for (auto &enemy: enemies) { for (auto it = enemy.getBullets().begin(); it != enemy.getBullets().end();) { - if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + if (ship->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Kolizja wykryta - ship.takeDamage(); + ship->takeDamage(); // Usuwanie pocisku it = enemy.getBullets().erase(it); } else { @@ -333,11 +327,11 @@ void Plansza::update() { bool bulletDestroyed = false; // Kolizja pocisku gracza z pociskiem Bombera - for (auto playerBulletIt = ship.getBullets().begin(); playerBulletIt != ship.getBullets().end();) { + for (auto playerBulletIt = ship->getBullets().begin(); playerBulletIt != ship->getBullets().end();) { if (playerBulletIt->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Usuń pocisk Bombera i pocisk gracza it = bomberEnemy.getBullets().erase(it); - playerBulletIt = ship.getBullets().erase(playerBulletIt); + playerBulletIt = ship->getBullets().erase(playerBulletIt); bulletDestroyed = true; break; } else { @@ -347,11 +341,11 @@ void Plansza::update() { // Kolizja rakiety gracza z pociskiem Bombera if (!bulletDestroyed) { - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (rocketIt->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Usuń pocisk Bombera i rakietę gracza it = bomberEnemy.getBullets().erase(it); - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); bulletDestroyed = true; break; } else { @@ -362,9 +356,9 @@ void Plansza::update() { // Jeśli pocisk Bombera przetrwał dotychczasowe sprawdzenia, wykonaj inne działania if (!bulletDestroyed) { - if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + if (ship->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Kolizja pocisku Bombera z graczem - ship.takeDamage(); + ship->takeDamage(); it = bomberEnemy.getBullets().erase(it); } else { ++it; @@ -377,8 +371,8 @@ void Plansza::update() { wiazkowiec.update(); if (wiazkowiec.isShooting() && wiazkowiec.getBeam().isVisible()) { - if (ship.getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam().getBounds())) { - ship.takeDamage(); // Gracz otrzymuje obrażenia + if (ship->getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam().getBounds())) { + ship->takeDamage(); // Gracz otrzymuje obrażenia } } @@ -402,9 +396,9 @@ void Plansza::update() { // Kolizje między pociskami gracza a przeciwnikami for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { bool hit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (enemyIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship.getBullets().erase(bulletIt); + bulletIt = ship->getBullets().erase(bulletIt); enemyIt->takeDamage(); hit = true; break; @@ -421,9 +415,9 @@ void Plansza::update() { for (auto advancedIt = AEnemies.begin(); advancedIt != AEnemies.end();) { bool hit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (advancedIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship.getBullets().erase(bulletIt); + bulletIt = ship->getBullets().erase(bulletIt); advancedIt->takeDamage(); hit = true; break; @@ -440,9 +434,9 @@ void Plansza::update() { for (auto bomberIt = BEnemies.begin(); bomberIt != BEnemies.end();) { bool hit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (bomberIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship.getBullets().erase(bulletIt); + bulletIt = ship->getBullets().erase(bulletIt); bomberIt->takeDamage(); hit = true; break; @@ -459,9 +453,9 @@ void Plansza::update() { for (auto kamikadzeIt = KEnemies.begin(); kamikadzeIt != KEnemies.end();) { bool hit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (kamikadzeIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship.getBullets().erase(bulletIt); + bulletIt = ship->getBullets().erase(bulletIt); kamikadzeIt->takeDamage(); hit = true; break; @@ -478,9 +472,9 @@ void Plansza::update() { for (auto wiazkowiecIt = WEnemies.begin(); wiazkowiecIt != WEnemies.end();) { bool hit = false; - for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (wiazkowiecIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship.getBullets().erase(bulletIt); + bulletIt = ship->getBullets().erase(bulletIt); wiazkowiecIt->takeDamage(); hit = true; break; @@ -500,9 +494,9 @@ void Plansza::update() { //oblsuga dla rakiety for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { bool hit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (enemyIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); enemyIt->takeDamage(); hit = true; break; @@ -519,9 +513,9 @@ void Plansza::update() { for (auto advancedIt = AEnemies.begin(); advancedIt != AEnemies.end();) { bool hit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (advancedIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); advancedIt->takeDamage(); hit = true; break; @@ -538,9 +532,9 @@ void Plansza::update() { for (auto bomberIt = BEnemies.begin(); bomberIt != BEnemies.end();) { bool hit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (bomberIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); bomberIt->takeDamage(); hit = true; break; @@ -557,9 +551,9 @@ void Plansza::update() { for (auto kamikadzeIt = KEnemies.begin(); kamikadzeIt != KEnemies.end();) { bool hit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (kamikadzeIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); kamikadzeIt->takeDamage(); hit = true; break; @@ -576,9 +570,9 @@ void Plansza::update() { for (auto wiazkowiecIt = WEnemies.begin(); wiazkowiecIt != WEnemies.end();) { bool hit = false; - for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (wiazkowiecIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship.getRockets().erase(rocketIt); + rocketIt = ship->getRockets().erase(rocketIt); wiazkowiecIt->takeDamage(); hit = true; break; @@ -621,6 +615,13 @@ void Plansza::spawn_meteor() { } } +void Plansza::spawn_player() { + ship = Player::getInstance(static_cast(window->getSize().x) / 2, static_cast(window->getSize().y) - 100, this->playerTexture); + ship->loadTexture(); + ship->setMovingSpeed(8); + ship->setFirerate(200); +} + void Plansza::spawn_enemy() { if (enemySpawnClock.getElapsedTime().asSeconds() >= 10) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); @@ -691,7 +692,4 @@ void Plansza::update_score() { text.setFillColor(sf::Color::White); text.setPosition(25, 25); window->draw(text); -} - - - +} \ No newline at end of file diff --git a/sources/Player.cpp b/sources/Player.cpp index 5e64758..a5149e5 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -5,16 +5,20 @@ #include #include -#include "../headers/Bullet.h" +Player::Player(int x, int y, const sf::Texture& texture) : Actor(x, y, texture) { -Player::Player(int x, int y, const sf::Texture& texture, const sf::Texture& bulletTexture, const sf::Texture& rocketTexture) : Actor(x, y, texture), bulletTexture(bulletTexture), rocketTexture(rocketTexture) { +} -}; +Player* Player::getInstance(int x, int y, const sf::Texture& texture) { + if (player_ == nullptr) { + player_ = new Player(x, y, texture); + } + return player_; +} -void Player::setTextures(const sf::Texture& shipTexture, const sf::Texture& bulletTexture, const sf::Texture& rocketTexture) { - this->actorSprite.setTexture(shipTexture); // Poprawiona nazwa - actorSprite zamiast shipSprite - this->bulletTexture = bulletTexture; - this->rocketTexture = rocketTexture; +void Player::loadTexture() { + bulletTexture.loadFromFile("../assets/img/bullets/bullet_pink.png"); + rocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png"); } void Player::shoot() { @@ -106,3 +110,5 @@ void Player::moveDown() { std::vector &Player::getRockets() { return rockets; } + +Player* Player::player_ = nullptr;