From 38fd71b8e6c4d786e81b656aae2069fae269f977 Mon Sep 17 00:00:00 2001 From: Kuba Date: Wed, 11 Dec 2024 23:47:20 +0100 Subject: [PATCH] 5 przeciwnikow, jakos to dziala --- assets/img/{bullets => wiazka}/wiazka.png | Bin headers/Beam.h | 4 ++ headers/Player.h | 6 ++ headers/Wiazkowiec.h | 6 +- sources/Beam.cpp | 28 +++++++-- sources/Plansza.cpp | 70 +++++++++++++++++----- sources/Player.cpp | 43 +++++++++---- sources/Wiazkowiec.cpp | 43 +++++++++---- 8 files changed, 158 insertions(+), 42 deletions(-) rename assets/img/{bullets => wiazka}/wiazka.png (100%) diff --git a/assets/img/bullets/wiazka.png b/assets/img/wiazka/wiazka.png similarity index 100% rename from assets/img/bullets/wiazka.png rename to assets/img/wiazka/wiazka.png diff --git a/headers/Beam.h b/headers/Beam.h index 70bd6aa..704d15d 100644 --- a/headers/Beam.h +++ b/headers/Beam.h @@ -8,6 +8,8 @@ class Beam { public: Beam(float x, float y, float width, float height, const sf::Color& color); + void draw(sf::RenderWindow &window); + void update(); void render(sf::RenderWindow& window); @@ -20,6 +22,8 @@ public: private: sf::RectangleShape beamShape; bool visible; + sf::Texture beamTexture; + sf::Sprite beamSprite; }; #endif // LOTOSTATEK_BEAM_H \ No newline at end of file diff --git a/headers/Player.h b/headers/Player.h index 721d761..4793332 100644 --- a/headers/Player.h +++ b/headers/Player.h @@ -3,6 +3,8 @@ #include +#include + #include "Actor.h" #include "Rocket.h" @@ -20,6 +22,7 @@ public: void moveDown() override; void takeDamage(); bool isAlive() const; + void update(); std::vector& getRockets(); private: std::chrono::steady_clock::time_point lastShotTime = std::chrono::steady_clock::now(); @@ -27,6 +30,9 @@ private: sf::Texture rocketTexture; int health = 3; // Liczba punktów życia gracza sf::Texture bulletTexture; + bool isImmortal = false; // Czy gracz jest chwilowo nietykalny + sf::Clock immortalityClock; // Zegar kontrolujący czas nieśmiertelności + float immortalityDuration = 1.5f; // Czas trwania nieśmiertelności (w sekundach) }; diff --git a/headers/Wiazkowiec.h b/headers/Wiazkowiec.h index 8a44ae5..1c1fe64 100644 --- a/headers/Wiazkowiec.h +++ b/headers/Wiazkowiec.h @@ -32,9 +32,12 @@ public: void updateDirection(); bool isShooting() const; const Beam& getBeam() const; + void setPlanszaHeight(float height); + void setMapBounds(float width, float height); private: + float planszaHeight = 800.f; sf::Clock shootClock; sf::Texture WiazkaTexture; float movementSpeed = 2.0f; @@ -44,7 +47,8 @@ private: bool shooting = false; // Czy obecnie strzela sf::Clock shootingClock; // Zegar kontrolujący czas strzału float beamDuration = 1.0f; // Czas trwania widoczności wiązki (w sekundach) - + float mapWidth; // Szerokość mapy/planszy + float mapHeight; void spawnBeam(); // Tworzy wiązkę }; diff --git a/sources/Beam.cpp b/sources/Beam.cpp index afd3ac4..c0771a6 100644 --- a/sources/Beam.cpp +++ b/sources/Beam.cpp @@ -1,20 +1,40 @@ #include "../headers/Beam.h" +#include + Beam::Beam(float x, float y, float width, float height, const sf::Color& color) : visible(false) { beamShape.setPosition(x, y); beamShape.setSize({width, height}); beamShape.setFillColor(color); + + if (!beamTexture.loadFromFile("../assets/img/wiazka/wiazka.png")) { + std::cerr << "Błąd! Nie można załadować tekstury wiazka.png" << std::endl; + } + beamSprite.setTexture(beamTexture); + + if (beamTexture.getSize().x > 0 && beamTexture.getSize().y > 0) { + float scaleX = width / beamTexture.getSize().x; + float scaleY = height / beamTexture.getSize().y; + beamSprite.setScale(scaleX, scaleY); + beamSprite.setPosition(x, y); + } else { + std::cerr << "Błąd: Tekstura wiązki nie została poprawnie załadowana." << std::endl; + } + +} + +void Beam::draw(sf::RenderWindow& window) { + + window.draw(beamSprite); + } void Beam::update() { - // Wiązka może mieć logikę do czasu, jeśli potrzebne } void Beam::render(sf::RenderWindow& window) { - if (visible) { - window.draw(beamShape); - } + window.draw(beamSprite); } sf::FloatRect Beam::getBounds() const { diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 8b2217c..0a7f4a4 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -34,10 +34,6 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render std::cerr << "Failed to load enemy texture!" << std::endl; exit(-1); } - if (!WiazkaTexture.loadFromFile("../assets/img/bullets/wiazka.png")) { - std::cerr << "Failed to load wiazka texture!" << std::endl; - exit(-1); - } if (!advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png")) { std::cerr << "Failed to load advanced enemy texture!" << std::endl; exit(-1); @@ -55,7 +51,7 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render exit(-1); } if (!WiazkowiecTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png")) { - std::cerr << "Failed to load BombaTexture!" << std::endl; + std::cerr << "Failed to load Wiazkowiec texture!" << std::endl; exit(-1); } spawnClock.restart(); @@ -101,6 +97,7 @@ void Plansza::update() { // generowanie nowego meteoru //spawn_meteor(); + ship.update(); spawn_enemy(); spawn_advanced_enemy(); spawn_wiazkowiec(); @@ -414,6 +411,19 @@ void Plansza::update() { } } + for (auto& wiazkowiec : WEnemies) { + wiazkowiec.update(); + + if (wiazkowiec.isShooting() && wiazkowiec.getBeam().isVisible()) { + if (ship.getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam().getBounds())) { + ship.takeDamage(); // Gracz otrzymuje obrażenia + } + } + + window->draw(wiazkowiec.getSprite()); + wiazkowiec.render(*window); + } + // Usuwanie pocisków, które są poza ekranem srednio to dziala for (auto enemyIt = enemies.begin(); enemyIt != enemies.end(); ) { for (auto bulletIt = enemyIt->getBullets().begin(); bulletIt != enemyIt->getBullets().end();) { @@ -504,19 +514,27 @@ void Plansza::update() { } } - for (auto& wiazkowiec : WEnemies) { - wiazkowiec.update(); - - if (wiazkowiec.isShooting() && wiazkowiec.getBeam().isVisible()) { - if (ship.getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam().getBounds())) { - ship.takeDamage(); // Gracz otrzymuje obrażenia + for (auto wiazkowiecIt = WEnemies.begin(); wiazkowiecIt != WEnemies.end();) { + bool hit = false; + for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end();) { + if (wiazkowiecIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { + bulletIt = ship.getBullets().erase(bulletIt); + wiazkowiecIt->takeDamage(); + hit = true; + break; + } else { + ++bulletIt; } } - - window->draw(wiazkowiec.getSprite()); - wiazkowiec.render(*window); + if (hit && !wiazkowiecIt->isAlive()) { + wiazkowiecIt = WEnemies.erase(wiazkowiecIt); // Usunięcie przeciwnika Wiazkowiec + } else { + ++wiazkowiecIt; + } } + + //oblsuga dla rakiety for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { bool hit = false; @@ -594,6 +612,25 @@ void Plansza::update() { } } + for (auto wiazkowiecIt = WEnemies.begin(); wiazkowiecIt != WEnemies.end();) { + bool hit = false; + for (auto rocketIt = ship.getRockets().begin(); rocketIt != ship.getRockets().end();) { + if (wiazkowiecIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { + rocketIt = ship.getRockets().erase(rocketIt); + wiazkowiecIt->takeDamage(); + hit = true; + break; + } else { + ++rocketIt; + } + } + if (hit && !wiazkowiecIt->isAlive()) { + wiazkowiecIt = WEnemies.erase(wiazkowiecIt); + } else { + ++wiazkowiecIt; + } + } + } @@ -661,7 +698,10 @@ void Plansza::spawn_kamikadze() { void Plansza::spawn_wiazkowiec() { if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 10) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); - WEnemies.emplace_back(spawnX, -50, WiazkowiecTexture); + Wiazkowiec wiazkowiec(spawnX, -50, WiazkowiecTexture); + wiazkowiec.setPlanszaHeight(size.height); // Przekazanie wysokości okna + wiazkowiec.setMapBounds(size.width, size.height); + WEnemies.push_back(wiazkowiec); std::cout << "Spawned Wiazkowiec Enemy at X: " << spawnX << std::endl; WiazkowiecSpawnClock.restart(); } diff --git a/sources/Player.cpp b/sources/Player.cpp index f3b3810..5e64758 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -34,17 +34,40 @@ void Player::alternate_shoot() { } } -void Player::takeDamage() { - if (health > 0) { - health--; - std::cout << "Player hit! Remaining health: " << health << "\n"; - - - if (health <= 0) { - std::cout << "Player has been destroyed!\n"; - std::cout << "You lost the game!\n"; - +void Player::update() { + // Wyłącz nieśmiertelność po określonym czasie + if (isImmortal && immortalityClock.getElapsedTime().asSeconds() >= immortalityDuration) { + isImmortal = false; + std::cout << "Immortality ended.\n"; } + + // Efekt migania podczas nieśmiertelności + if (isImmortal) { + if (static_cast(immortalityClock.getElapsedTime().asMilliseconds() / 200) % 2 == 0) { + actorSprite.setColor(sf::Color(255, 255, 255, 128)); // Półprzezroczysty + } else { + actorSprite.setColor(sf::Color(255, 255, 255, 255)); // Normalny + } + } else { + actorSprite.setColor(sf::Color(255, 255, 255, 255)); // Normalny + } +} + +void Player::takeDamage() { + if (!isImmortal) { + if (health > 0) { + health--; + std::cout << "Player hit! Remaining health: " << health << "\n"; + isImmortal = true; // Aktywuj chwilową nieśmiertelność + immortalityClock.restart(); + + + if (health <= 0) { + std::cout << "Player has been destroyed!\n"; + std::cout << "You lost the game!\n"; + + } + } } } diff --git a/sources/Wiazkowiec.cpp b/sources/Wiazkowiec.cpp index a9443f9..954dd2b 100644 --- a/sources/Wiazkowiec.cpp +++ b/sources/Wiazkowiec.cpp @@ -13,6 +13,15 @@ Wiazkowiec::Wiazkowiec(int x, int y, const sf::Texture& texture) : Actor(x, y, t // BombaTexture.loadFromFile("../assets/img/bullets/bomba.png"); } +void Wiazkowiec::setPlanszaHeight(float height) { + planszaHeight = height; +} + +void Wiazkowiec::setMapBounds(float width, float height) { + mapWidth = width; + mapHeight = height; +} + void Wiazkowiec::spawnBeam() { float beamX = position.x; float beamY = position.y; @@ -23,16 +32,24 @@ void Wiazkowiec::spawnBeam() { case DirectionW::Up: beamHeight = position.y; beamY -= beamHeight; + beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Down: - beamHeight = 600 - position.y; + beamHeight = planszaHeight - position.y; // Dynamiczna wysokość okna + beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Left: - beamWidth = position.x; - beamX -= beamWidth; + beamHeight = 50.f; // Stała wysokość + beamWidth = position.x; + beamX -= beamWidth; // Wiązka w lewo od pozycji statku + beamY = position.y + (actorSprite.getGlobalBounds().height / 2) - 25.f; + beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Right: - beamWidth = 800 - position.x; + beamHeight = 50.f; // Stała wysokość + beamWidth = 800 - position.x; + beamY = position.y + (actorSprite.getGlobalBounds().height / 2) - 25.f; + beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; } @@ -72,17 +89,19 @@ void Wiazkowiec::setRandomDirection() { } void Wiazkowiec::updateDirection() { - // Zmieniamy kierunek przeciwnika, gdy dotrze do krawędzi + auto spriteBounds = actorSprite.getGlobalBounds(); + + // Kontrola dolnej i górnej krawędzi if (position.y <= 0) { direction = DirectionW::Down; - } else if (position.y >= 800) { + } else if (position.y + spriteBounds.height >= mapHeight) { direction = DirectionW::Up; } - // logika dla kierunku lewo/prawo + // Kontrola lewej i prawej krawędzi if (position.x <= 0) { direction = DirectionW::Right; - } else if (position.x >= 1200) { + } else if (position.x + spriteBounds.width >= mapWidth) { direction = DirectionW::Left; } } @@ -111,16 +130,16 @@ void Wiazkowiec::update() { switch (direction) { case DirectionW::Up: - moveUp(); + if (position.y > 0) moveUp(); break; case DirectionW::Down: - moveDown(); + if (position.y + actorSprite.getGlobalBounds().height < mapHeight) moveDown(); break; case DirectionW::Left: - moveLeft(); + if (position.x > 0) moveLeft(); break; case DirectionW::Right: - moveRight(); + if (position.x + actorSprite.getGlobalBounds().width < mapWidth) moveRight(); break; }