From f1dc19e795484e3b3f880fa462c8c4373aba010b Mon Sep 17 00:00:00 2001 From: Kuba Date: Thu, 12 Dec 2024 00:11:24 +0100 Subject: [PATCH] Bomber i wiazkowiec nie wylaza poza ekran --- headers/Bomber.h | 3 +++ headers/Wiazkowiec.h | 3 ++- sources/Bomber.cpp | 34 +++++++++++++++++++++++++++------- sources/Kamikadze.cpp | 16 ++++++---------- sources/Plansza.cpp | 17 +++++++++-------- sources/Wiazkowiec.cpp | 42 ++++++++++++++++++++++++++++++------------ 6 files changed, 77 insertions(+), 38 deletions(-) diff --git a/headers/Bomber.h b/headers/Bomber.h index 9de6954..562268d 100644 --- a/headers/Bomber.h +++ b/headers/Bomber.h @@ -31,8 +31,11 @@ public: bool isAlive() const; void takeDamage(); void updateDirection(); + void setPlanszaHeight(float height, float width); private: + float planszaHeight = 800.f; + float planszaWidth = 600.f; sf::Clock shootClock; sf::Texture BombaTexture; float movementSpeed = 2.0f; diff --git a/headers/Wiazkowiec.h b/headers/Wiazkowiec.h index 933e86d..cf996ad 100644 --- a/headers/Wiazkowiec.h +++ b/headers/Wiazkowiec.h @@ -32,12 +32,13 @@ public: void updateDirection(); bool isShooting() const; const Beam& getBeam() const; - void setPlanszaHeight(float height); + void setPlanszaHeight(float height, float width); void setMapBounds(float width, float height); private: float planszaHeight = 800.f; + float planszaWidth = 600.f; sf::Clock shootClock; sf::Texture WiazkaTexture; float movementSpeed = 2.0f; diff --git a/sources/Bomber.cpp b/sources/Bomber.cpp index 76b090c..7a81cd9 100644 --- a/sources/Bomber.cpp +++ b/sources/Bomber.cpp @@ -7,11 +7,14 @@ Bomber::Bomber(int x, int y, const sf::Texture& texture, const sf::Texture& bull BombaTexture = bulletTexture; hp = 2; // 2 punkty życia firerate = 10000; // Strzela co 10 - moving_speed = 1.0f; // Prędkość - // BombaTexture.loadFromFile("../assets/img/bullets/bomba.png"); + moving_speed = 10.0f; // Prędkość +} + +void Bomber::setPlanszaHeight(float height, float width) { + planszaHeight = height; + planszaWidth = width; } -// Losuje losowy kierunek dla Bombera void Bomber::setRandomDirection() { std::random_device rd; std::mt19937 gen(rd()); @@ -47,22 +50,39 @@ void Bomber::shoot() { } void Bomber::updateDirection() { - // Zmieniamy kierunek przeciwnika, gdy dotrze do krawędzi + auto spriteBounds = actorSprite.getGlobalBounds(); // Pobierz rozmiar i pozycję sprite'a + + // Kontrola górnej i dolnej krawędzi (wysokości planszy) if (position.y <= 0) { direction = DirectionB::Down; - } else if (position.y >= 800) { + } else if (position.y + spriteBounds.height >= planszaHeight) { direction = DirectionB::Up; } - // logika dla kierunku lewo/prawo + // Kontrola lewej i prawej krawędzi (szerokości planszy) if (position.x <= 0) { direction = DirectionB::Right; - } else if (position.x >= 1200) { + } else if (position.x + spriteBounds.width >= planszaWidth) { direction = DirectionB::Left; } } void Bomber::move(float deltaX, float deltaY) { + auto spriteBounds = actorSprite.getGlobalBounds(); // Rozmiar i pozycja sprite'a + + // Zapobiegaj wyjściu poza poziome granice + if (position.x + deltaX < 0) { + deltaX = -position.x; + } else if (position.x + spriteBounds.width + deltaX > planszaWidth) { + deltaX = planszaWidth - (position.x + spriteBounds.width); + } + + // Zapobiegaj wyjściu poza pionowe granice + if (position.y + deltaY < 0) { + deltaY = -position.y; + } else if (position.y + spriteBounds.height + deltaY > planszaHeight) { + deltaY = planszaHeight - (position.y + spriteBounds.height); + } actorSprite.move(deltaX, deltaY); position.x += static_cast(deltaX); position.y += static_cast(deltaY); diff --git a/sources/Kamikadze.cpp b/sources/Kamikadze.cpp index c3aaeb0..e18927c 100644 --- a/sources/Kamikadze.cpp +++ b/sources/Kamikadze.cpp @@ -13,7 +13,6 @@ Kamikadze::Kamikadze(int x, int y, const sf::Texture& texture) : Actor(x, y, tex void Kamikadze::shoot(){} -// Losuje losowy kierunek dla Bombera void Kamikadze::setRandomDirection() { std::random_device rd; std::mt19937 gen(rd()); @@ -56,31 +55,28 @@ void Kamikadze::updateDirection() { } void Kamikadze::followPlayer(const sf::Vector2f& playerPosition) { - // Oblicz różnicę w pozycjach float diffX = playerPosition.x - position.x; float diffY = playerPosition.y - position.y; - // Normalizacja wektora (skrócenie kierunku do jednostkowego) float magnitude = std::sqrt(diffX * diffX + diffY * diffY); if (magnitude != 0) { diffX /= magnitude; diffY /= magnitude; - // Aktualizacja pozycji Kamikadze w kierunku gracza z uwzględnieniem prędkości + // Aktualizacja pozycji Kamikadze w kierunku gracza position.x += diffX * movementSpeed; position.y += diffY * movementSpeed; - } else { - // Jeśli Kamikadze jest dokładnie na pozycji gracza, zatrzymaj jego ruch + } else { //zatrzymanie kamikadze movementSpeed = 0.0f; } } void Kamikadze::explode(const sf::Vector2f& playerPosition, bool& playerHit) { if (!exploding) { - // Rozpocznij eksplozję + // Rozpocznij kamikadze exploding = true; explosionClock.restart(); - movementSpeed = 0.0f; // Zatrzymaj Kamikadze + movementSpeed = 0.0f; std::cout << "Kamikadze exploding!" << std::endl; std::cout << "Kamikadze position: (" << position.x << ", " << position.y << ")" << std::endl; @@ -121,9 +117,9 @@ void Kamikadze::moveDown() { move(0.0f, moving_speed); } void Kamikadze::update(const sf::Vector2f& playerPosition) { if (alive && !exploding) { - // Podążaj za graczem, dopóki Kamikadze jest żywy i nie eksploduje + // Podążanie za graczem, dopóki Kamikadze jest żywy followPlayer(playerPosition); - actorSprite.setPosition(position.x, position.y); // Aktualizuj sprite + actorSprite.setPosition(position.x, position.y); } } diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index d16135a..a7969c8 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -96,8 +96,8 @@ void Plansza::update() { } // generowanie nowego meteoru - //spawn_meteor(); ship.update(); + spawn_meteor(); spawn_enemy(); spawn_advanced_enemy(); spawn_wiazkowiec(); @@ -254,7 +254,7 @@ void Plansza::update() { } } for (auto it = BEnemies.begin(); it != BEnemies.end();) { - it->update(); // Ruch b + it->update(); // Ruch bombera it->shoot(); // Strzał przeciwnika window->draw(it->getSprite()); // Rysowanie na ekranie @@ -272,7 +272,6 @@ void Plansza::update() { sf::Vector2f playerPosition = ship.getSprite().getPosition(); // Aktualna pozycja gracza bool playerHit = false; - // Aktualizacja pozycji Kamikadze it->update(playerPosition); // Wybuch, gdy Kamikadze dotknie gracza @@ -289,7 +288,7 @@ void Plansza::update() { it->explode(playerPosition, playerHit); // Eksplozja trwa } - // Usunięcie martwego Kamikadze z listy + // Usunięcie martwego Kamikadze if (it->isAlive()) { window->draw(it->getSprite()); ++it; @@ -678,9 +677,11 @@ void Plansza::spawn_advanced_enemy() { } void Plansza::spawn_bomber() { - if (BomberSpawnClock.getElapsedTime().asSeconds() >= 120) { // Spawn co 10 sekund + if (BomberSpawnClock.getElapsedTime().asSeconds() >= 10) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); - BEnemies.emplace_back(spawnX, -50, BomberEnemyTexture, BombaTexture); + Bomber bomber(spawnX, -50, BomberEnemyTexture, BombaTexture); + bomber.setPlanszaHeight(size.height, size.width); // Przekazanie wysokości i szerokości okna + BEnemies.push_back(bomber); std::cout << "Spawned Bomber Enemy at X: " << spawnX << std::endl; BomberSpawnClock.restart(); } @@ -696,10 +697,10 @@ void Plansza::spawn_kamikadze() { } void Plansza::spawn_wiazkowiec() { - if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 10) { // Spawn co 10 sekund + if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 110) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); Wiazkowiec wiazkowiec(spawnX, -50, WiazkowiecTexture); - wiazkowiec.setPlanszaHeight(size.height); // Przekazanie wysokości okna + wiazkowiec.setPlanszaHeight(size.height, size.width); // Przekazanie wysokości i szerokosci okna WEnemies.push_back(wiazkowiec); std::cout << "Spawned Wiazkowiec Enemy at X: " << spawnX << std::endl; WiazkowiecSpawnClock.restart(); diff --git a/sources/Wiazkowiec.cpp b/sources/Wiazkowiec.cpp index 4e3d7d3..c51371b 100644 --- a/sources/Wiazkowiec.cpp +++ b/sources/Wiazkowiec.cpp @@ -9,12 +9,12 @@ Wiazkowiec::Wiazkowiec(int x, int y, const sf::Texture& texture) : Actor(x, y, t actorSprite.setTexture(texture); hp = 2; // 2 punkty życia firerate = 5000; // Strzela co 10 - moving_speed = 1.0f; // Prędkość - // BombaTexture.loadFromFile("../assets/img/bullets/bomba.png"); + moving_speed = 5.0f; // Prędkość } -void Wiazkowiec::setPlanszaHeight(float height) { +void Wiazkowiec::setPlanszaHeight(float height, float width) { planszaHeight = height; + planszaWidth = width; } void Wiazkowiec::spawnBeam() { @@ -30,18 +30,18 @@ void Wiazkowiec::spawnBeam() { beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Down: - beamHeight = planszaHeight - position.y; // Dynamiczna wysokość okna + beamHeight = planszaHeight - position.y; beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Left: - beamHeight = 50.f; // Stała wysokość + beamHeight = 50.f; beamWidth = position.x; - beamX -= beamWidth; // Wiązka w lewo od pozycji statku + beamX -= beamWidth; beamY = position.y + (actorSprite.getGlobalBounds().height / 2) - 25.f; beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); break; case DirectionW::Right: - beamHeight = 50.f; // Stała wysokość + beamHeight = 50.f; beamWidth = 800 - position.x; beamY = position.y + (actorSprite.getGlobalBounds().height / 2) - 25.f; beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); @@ -52,7 +52,7 @@ void Wiazkowiec::spawnBeam() { beam.setVisible(true); shooting = true; - shootingClock.restart(); // Reset zegara + shootingClock.restart(); } // Strzał wiązki @@ -84,23 +84,41 @@ void Wiazkowiec::setRandomDirection() { } void Wiazkowiec::updateDirection() { - // Zmieniamy kierunek przeciwnika, gdy dotrze do krawędzi + auto spriteBounds = actorSprite.getGlobalBounds(); // Pobierz rozmiar i pozycję sprite'a + + // Kontrola górnej i dolnej krawędzi if (position.y <= 0) { direction = DirectionW::Down; - } else if (position.y >= 800) { + } else if (position.y + spriteBounds.height >= planszaHeight) { 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 >= planszaWidth) { direction = DirectionW::Left; } } void Wiazkowiec::move(float deltaX, float deltaY) { + auto spriteBounds = actorSprite.getGlobalBounds(); // Rozmiar i pozycja sprite'a + + // Zapobiegaj wyjściu poza poziome granice + if (position.x + deltaX < 0) { + deltaX = -position.x; + } else if (position.x + spriteBounds.width + deltaX > planszaWidth) { + deltaX = planszaWidth - (position.x + spriteBounds.width); + } + + // Zapobiegaj wyjściu poza pionowe granice + if (position.y + deltaY < 0) { + deltaY = -position.y; + } else if (position.y + spriteBounds.height + deltaY > planszaHeight) { + deltaY = planszaHeight - (position.y + spriteBounds.height); + } + actorSprite.move(deltaX, deltaY); position.x += static_cast(deltaX); position.y += static_cast(deltaY);