diff --git a/headers/Actor.h b/headers/Actor.h index 741cf42..0433254 100644 --- a/headers/Actor.h +++ b/headers/Actor.h @@ -11,8 +11,7 @@ class Actor { public: Actor(int x, int y, const sf::Texture& texture); - - + virtual ~Actor() = default; sf::Sprite& getSprite(); unsigned int getHP(); diff --git a/headers/AdvancedEnemy.h b/headers/AdvancedEnemy.h index 769fa74..f3dae6e 100644 --- a/headers/AdvancedEnemy.h +++ b/headers/AdvancedEnemy.h @@ -3,8 +3,6 @@ #include "Enemy.h" -#include - enum class DirectionA { Up, Down, diff --git a/headers/Beam.h b/headers/Beam.h index 704d15d..ce08a41 100644 --- a/headers/Beam.h +++ b/headers/Beam.h @@ -2,27 +2,16 @@ #define LOTOSTATEK_BEAM_H #include -#include "Position.h" 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); - - sf::FloatRect getBounds() const; - - bool isVisible() const; - void setVisible(bool visible); + Beam() = default; + Beam(int x, int y, const sf::Texture &texture); + sf::Sprite getSprite(); + void setRotation(float angle); private: - sf::RectangleShape beamShape; - bool visible; - sf::Texture beamTexture; sf::Sprite beamSprite; }; diff --git a/headers/Bullet.h b/headers/Bullet.h index cc29809..f521be2 100644 --- a/headers/Bullet.h +++ b/headers/Bullet.h @@ -2,14 +2,11 @@ #define LOTOSTATEK_BULLET_H #include "Projectile.h" -#include "SFML/Graphics/Texture.hpp" class Bullet : public Projectile { public: Bullet(float x, float y, sf::Texture &texture) : Projectile(x,y, texture) {}; void update() override; -private: - float directionY; }; diff --git a/headers/Heart.hpp b/headers/Heart.hpp index ecaf8b6..14c785c 100644 --- a/headers/Heart.hpp +++ b/headers/Heart.hpp @@ -2,13 +2,12 @@ #define LOTOSTATEK_HEART_HPP #include "SFML/Graphics/Texture.hpp" -#include "SFML/Graphics/Sprite.hpp" #include "ObjectItem.hpp" class Heart : public ObjectItem { public: Heart(float x, float y, sf::Texture &texture); - void update(); + void update() override; }; #endif //LOTOSTATEK_HEART_HPP diff --git a/headers/Meteor.h b/headers/Meteor.h index 1a01eec..4439eb7 100644 --- a/headers/Meteor.h +++ b/headers/Meteor.h @@ -8,7 +8,7 @@ class Meteor : public ObjectItem { public: - Meteor(float x, float y, sf::Texture &texture); + Meteor(float x, float y, sf::Texture &texture_); void update(); }; diff --git a/headers/ObjectItem.hpp b/headers/ObjectItem.hpp index 18157e7..bfcdaee 100644 --- a/headers/ObjectItem.hpp +++ b/headers/ObjectItem.hpp @@ -12,7 +12,7 @@ public: bool getStatus(); virtual void update() = 0; protected: - sf::Texture texture; + sf::Texture texture_; sf::Sprite sprite; Position position; float rotationSpeed; diff --git a/headers/Position.h b/headers/Position.h index 6f69670..a43976a 100644 --- a/headers/Position.h +++ b/headers/Position.h @@ -6,4 +6,14 @@ struct Position { int y; }; +struct PositionU { + unsigned int x; + unsigned int y; +}; + +struct PositionF { + float x; + float y; +}; + #endif //LOTOSTATEK_POSITION_H diff --git a/headers/Wiazkowiec.h b/headers/Wiazkowiec.h index cf996ad..23e7752 100644 --- a/headers/Wiazkowiec.h +++ b/headers/Wiazkowiec.h @@ -13,42 +13,47 @@ enum class DirectionW { class Wiazkowiec : public Actor { public: - Wiazkowiec(int x, int y, const sf::Texture& texture); + Wiazkowiec(int x, int y, const sf::Texture& texture, sf::RenderWindow *window); - void shoot() override; void move(float deltaX, float deltaY) override; void moveLeft() override; void moveRight() override; void moveUp() override; void moveDown() override; + + void takeDamage(); + void setRandomDirection(); + void checkIfBeamShootOutOfBounds(); void update(); - + void shoot() override; void render(sf::RenderWindow &window); bool isAlive() const; - void takeDamage(); - void updateDirection(); bool isShooting() const; - const Beam& getBeam() const; - void setPlanszaHeight(float height, float width); - void setMapBounds(float width, float height); + void setPlanszaHeight(int height, int width); + Beam* getBeam() const; private: - float planszaHeight = 800.f; - float planszaWidth = 600.f; - sf::Clock shootClock; sf::Texture WiazkaTexture; - float movementSpeed = 2.0f; - bool alive = true; - DirectionW direction = DirectionW::Down; - Beam beam; // Wiązka - bool shooting = false; + sf::Texture beamTexture; + sf::Clock shootClock; sf::Clock shootingClock; - float beamDuration = 1.0f; + DirectionW direction = DirectionW::Down; + + Beam *beam; // wskaźnik na wiązkę + sf::RenderWindow *window_ptr; + void spawnBeam(); // Tworzy wiązkę + + int planszaHeight = 800; + int planszaWidth = 600; + float beamDuration = 1.0f; + float movementSpeed = 2.0f; + bool shooting = false; + bool alive = true; }; #endif //WIAZKOWIEC_H diff --git a/sources/AdvancedEnemy.cpp b/sources/AdvancedEnemy.cpp index 516454b..746189a 100644 --- a/sources/AdvancedEnemy.cpp +++ b/sources/AdvancedEnemy.cpp @@ -3,7 +3,6 @@ #include "../headers/Plansza.h" AdvancedEnemy::AdvancedEnemy(int x, int y, const sf::Texture& texture, const sf::Texture& bulletTexture) : Actor(x, y, texture) { - actorSprite.setTexture(texture); enemyBulletTexture = bulletTexture; hp = 2; // 2 punkty życia firerate = 2000; // Strzela co 2 diff --git a/sources/Beam.cpp b/sources/Beam.cpp index c0771a6..3ccf6d7 100644 --- a/sources/Beam.cpp +++ b/sources/Beam.cpp @@ -2,50 +2,21 @@ #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); +Beam::Beam(int x, int y, const sf::Texture& texture) { + beamSprite.setOrigin(beamSprite.getLocalBounds().width/2, beamSprite.getLocalBounds().height/2); + if (texture.getSize().x > 0 && texture.getSize().y > 0) { beamSprite.setPosition(x, y); } else { std::cerr << "Błąd: Tekstura wiązki nie została poprawnie załadowana." << std::endl; } - + beamSprite.setTexture(texture); } -void Beam::draw(sf::RenderWindow& window) { - - window.draw(beamSprite); - +sf::Sprite Beam::getSprite() { + return beamSprite; } -void Beam::update() { -} - -void Beam::render(sf::RenderWindow& window) { - window.draw(beamSprite); -} - -sf::FloatRect Beam::getBounds() const { - return beamShape.getGlobalBounds(); -} - -bool Beam::isVisible() const { - return visible; -} - -void Beam::setVisible(bool visible) { - this->visible = visible; +void Beam::setRotation(float angle) { + beamSprite.setRotation(angle); } diff --git a/sources/Bomber.cpp b/sources/Bomber.cpp index 9d29b9a..d56bd99 100644 --- a/sources/Bomber.cpp +++ b/sources/Bomber.cpp @@ -4,7 +4,6 @@ #include Bomber::Bomber(int x, int y, const sf::Texture& texture, const sf::Texture& bulletTexture) : Actor(x, y, texture) { - actorSprite.setTexture(texture); BombaTexture = bulletTexture; hp = 2; // 2 punkty życia firerate = 10000; // Strzela co 10 diff --git a/sources/Bullet.cpp b/sources/Bullet.cpp index 226401f..5b766c7 100644 --- a/sources/Bullet.cpp +++ b/sources/Bullet.cpp @@ -1,8 +1,5 @@ #include "../headers/Bullet.h" -#include -#include - void Bullet::update() { //std::cout << "Start update: speed = " << speed << ", position.y = " << position.y << std::endl; sprite.move(0.0f, speed); diff --git a/sources/Enemy.cpp b/sources/Enemy.cpp index 484fba0..731281a 100644 --- a/sources/Enemy.cpp +++ b/sources/Enemy.cpp @@ -3,7 +3,6 @@ #include "../headers/Plansza.h" Enemy::Enemy(int x, int y, const sf::Texture& texture) : Actor(x, y, texture) { - actorSprite.setTexture(texture); hp = 1; // Przeciwnik ma 1 punkt życia firerate = 2000; // Strzela co 2 moving_speed = 2.0f; // Prędkość diff --git a/sources/Kamikadze.cpp b/sources/Kamikadze.cpp index f78833a..f2fd0c2 100644 --- a/sources/Kamikadze.cpp +++ b/sources/Kamikadze.cpp @@ -7,7 +7,6 @@ Kamikadze::Kamikadze(int x, int y, const sf::Texture& texture) : Actor(x, y, texture) { - actorSprite.setTexture(texture); hp = 3; // 3 punkty życia moving_speed = 2.0f; // Prędkość } diff --git a/sources/Meteor.cpp b/sources/Meteor.cpp index 6e0e2eb..edbe41e 100644 --- a/sources/Meteor.cpp +++ b/sources/Meteor.cpp @@ -2,7 +2,7 @@ Meteor::Meteor(float x, float y, sf::Texture &texture) : ObjectItem(x, y, texture) { outOfBounds = false; - texture = texture; + texture_ = texture; sprite.setTexture(texture); sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite sprite.setPosition(x, y); diff --git a/sources/ObjectItem.cpp b/sources/ObjectItem.cpp index 7e4bb22..4d80017 100644 --- a/sources/ObjectItem.cpp +++ b/sources/ObjectItem.cpp @@ -1,11 +1,11 @@ #include "../headers/ObjectItem.hpp" ObjectItem::ObjectItem(float x, float y, sf::Texture &texture) { - Position position_; - position_.x = x; - position_.y = y; + Position position_ = {0,0}; + position_.x = static_cast(x); + position_.y = static_cast(y); position = position_; - this->texture = texture; + this->texture_ = texture; } bool ObjectItem::getStatus() { diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 5413583..0e9c294 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) { @@ -140,7 +140,7 @@ void Plansza::update() { window->draw(rocket.getSprite()); } - // Sprawdzenie czy meteory i pociski są poza granicami ekranu + // Sprawdzenie, czy meteory i pociski są poza granicami ekranu update_meteors(); update_hearts(); ship->updateBullets(); @@ -406,7 +406,7 @@ void Plansza::update() { if (playerBulletIt->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Usuń pocisk Bombera i pocisk gracza it = bomberEnemy.getBullets().erase(it); - playerBulletIt = ship->getBullets().erase(playerBulletIt); + ship->getBullets().erase(playerBulletIt); bulletDestroyed = true; break; } else { @@ -420,7 +420,7 @@ void Plansza::update() { if (rocketIt->getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { // Usuń pocisk Bombera i rakietę gracza it = bomberEnemy.getBullets().erase(it); - rocketIt = ship->getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); bulletDestroyed = true; break; } else { @@ -445,14 +445,13 @@ void Plansza::update() { for (auto &wiazkowiec: WEnemies) { wiazkowiec.update(); - if (wiazkowiec.isShooting() && wiazkowiec.getBeam().isVisible()) { - if (ship->getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam().getBounds())) { + if (wiazkowiec.isShooting()) { + if (ship->getSprite().getGlobalBounds().intersects(wiazkowiec.getBeam()->getSprite().getGlobalBounds())) { ship->takeDamage(); // Gracz otrzymuje obrażenia } } window->draw(wiazkowiec.getSprite()); - wiazkowiec.render(*window); } // TODO: naprawić to co średnio działa @@ -474,7 +473,7 @@ void Plansza::update() { bool hit = false; for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (enemyIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship->getBullets().erase(bulletIt); + ship->getBullets().erase(bulletIt); enemyIt->takeDamage(); hit = true; break; @@ -493,7 +492,7 @@ void Plansza::update() { bool hit = false; for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (advancedIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship->getBullets().erase(bulletIt); + ship->getBullets().erase(bulletIt); advancedIt->takeDamage(); hit = true; break; @@ -512,7 +511,7 @@ void Plansza::update() { bool hit = false; for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (bomberIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship->getBullets().erase(bulletIt); + ship->getBullets().erase(bulletIt); bomberIt->takeDamage(); hit = true; break; @@ -531,7 +530,7 @@ void Plansza::update() { bool hit = false; for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) { if (kamikadzeIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) { - bulletIt = ship->getBullets().erase(bulletIt); + ship->getBullets().erase(bulletIt); kamikadzeIt->takeDamage(); hit = true; break; @@ -550,7 +549,7 @@ void Plansza::update() { 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); + ship->getBullets().erase(bulletIt); wiazkowiecIt->takeDamage(); hit = true; break; @@ -572,7 +571,7 @@ void Plansza::update() { bool hit = false; for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (enemyIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship->getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); enemyIt->takeDamage(); hit = true; break; @@ -591,7 +590,7 @@ void Plansza::update() { bool hit = false; for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (advancedIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship->getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); advancedIt->takeDamage(); hit = true; break; @@ -610,7 +609,7 @@ void Plansza::update() { bool hit = false; for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (bomberIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship->getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); bomberIt->takeDamage(); hit = true; break; @@ -629,7 +628,7 @@ void Plansza::update() { bool hit = false; for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) { if (kamikadzeIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) { - rocketIt = ship->getRockets().erase(rocketIt); + ship->getRockets().erase(rocketIt); kamikadzeIt->takeDamage(); hit = true; break; @@ -648,7 +647,7 @@ void Plansza::update() { 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); + ship->getRockets().erase(rocketIt); wiazkowiecIt->takeDamage(); hit = true; break; @@ -687,6 +686,8 @@ void Plansza::update() { heartStats[1].setTexture(heartTexture); heartStats[2].setTexture(heartTexture); break; + default: + break; } @@ -698,7 +699,7 @@ void Plansza::update() { void Plansza::update_meteors() { - // usuwanie meteorów które wyleciały poza ekran + // usuwanie meteorów, które wyleciały poza ekran for (auto &meteor: meteors) { if (meteor.getStatus()) { meteors.erase(meteors.begin()); @@ -775,19 +776,21 @@ void Plansza::spawn_kamikadze() { } void Plansza::spawn_wiazkowiec() { - if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 50) { // Spawn co 10 sekund - int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); - Wiazkowiec wiazkowiec(spawnX, -50, WiazkowiecTexture); - 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(); + if (WiazkowiecSpawnClock.getElapsedTime().asSeconds() >= 5) { // Spawn co 10 sekund + if (WEnemies.size() < 1) { + int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); + Wiazkowiec wiazkowiec(spawnX, -50, WiazkowiecTexture, window); + 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(); + } } } void Plansza::update_hearts() { - // usuwanie serduszek które wyleciały poza ekran + // usuwanie serduszek, które wyleciały poza ekran for (auto& heart : hearts) { if(heart.getStatus()) { hearts.erase(hearts.begin()); diff --git a/sources/Player.cpp b/sources/Player.cpp index 56a2ce7..7170b2f 100644 --- a/sources/Player.cpp +++ b/sources/Player.cpp @@ -1,10 +1,7 @@ -#include - #include "../headers/Player.h" #include #include -#include #include #include "../headers/Plansza.h" @@ -24,8 +21,14 @@ Player* Player::getInstance(int x, int y, const sf::Texture& texture) { } void Player::loadTexture() { - bulletTexture.loadFromFile("../assets/img/bullets/bullet_pink.png"); - rocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png"); + try { + bulletTexture.loadFromFile("../assets/img/bullets/bullet_pink.png"); + rocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png"); + } catch (std::exception &e) { + std::cerr << "Failed to load textures: " << e.what() << std::endl; + exit(-500); + } + damageDealClock.restart(); originalColor = actorSprite.getColor(); } diff --git a/sources/Rocket.cpp b/sources/Rocket.cpp index 39af7af..2d7970a 100644 --- a/sources/Rocket.cpp +++ b/sources/Rocket.cpp @@ -2,7 +2,7 @@ void Rocket::update() { sprite.move(0.0f, speed); - position.y += int(speed); + position.y += static_cast(speed); if(position.y < -100) { outOfBounds = true; } diff --git a/sources/Wiazkowiec.cpp b/sources/Wiazkowiec.cpp index d97d0c1..f73de42 100644 --- a/sources/Wiazkowiec.cpp +++ b/sources/Wiazkowiec.cpp @@ -1,56 +1,60 @@ #include "../headers/Wiazkowiec.h" +#include "../headers/Plansza.h" +#include "../headers/RandomNumberGenerator.h" #include -#include -#include "../headers/Plansza.h" -Wiazkowiec::Wiazkowiec(int x, int y, const sf::Texture& texture) : Actor(x, y, texture), beam(0, 0, 50.f, 50.f, sf::Color::Red) { - actorSprite.setTexture(texture); +Wiazkowiec::Wiazkowiec(int x, int y, const sf::Texture &texture, sf::RenderWindow *window) : Actor(x, y, texture), + beam(nullptr) +{ + window_ptr = window; + + try { + beamTexture.loadFromFile("../assets/img/wiazka/laser.png"); + } catch (std::exception &e) { + std::cerr << "Failed to load textures: " << e.what() << std::endl; + exit(-500); + } + hp = 2; // 2 punkty życia firerate = 5000; // Strzela co 10 moving_speed = 5.0f; // Prędkość } -void Wiazkowiec::setPlanszaHeight(float height, float width) { +void Wiazkowiec::setPlanszaHeight(int height, int width) { planszaHeight = height; planszaWidth = width; } void Wiazkowiec::spawnBeam() { - float beamX = position.x; - float beamY = position.y; - float beamWidth = 50.f; - float beamHeight = 0.f; + int beamX = actorSprite.getPosition().x; + int beamY = actorSprite.getPosition().y; switch (direction) { - case DirectionW::Up: - beamHeight = position.y; - beamY -= beamHeight; - beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); - break; - case DirectionW::Down: - beamHeight = planszaHeight - position.y; - beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); - break; - case DirectionW::Left: - beamHeight = 50.f; - beamWidth = position.x; - 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; - beamWidth = 800 - position.x; - beamY = position.y + (actorSprite.getGlobalBounds().height / 2) - 25.f; - beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); - break; + case DirectionW::Up: { + beam = new Beam(beamX, beamY, beamTexture); + beam->setRotation(180); + break; + } + case DirectionW::Down: { + beam = new Beam(beamX, beamY, beamTexture); + break; + } + case DirectionW::Left: { + beam = new Beam(beamX, beamY, beamTexture); + beam->setRotation(90); + break; + } + case DirectionW::Right: { + beam = new Beam(beamX, beamY, beamTexture); + beam->setRotation(270); + break; + } + default: + break; } - beam = Beam(beamX, beamY, beamWidth, beamHeight, sf::Color::Red); - beam.setVisible(true); - shooting = true; shootingClock.restart(); } @@ -59,31 +63,53 @@ void Wiazkowiec::spawnBeam() { void Wiazkowiec::shoot() { if (!shooting) { spawnBeam(); - std::cout << "Wiazkowiec shot a beam!" << std::endl; + } + switch (direction) { + case DirectionW::Up: { + std::cout << "Direction is up" << std::endl; + break; + } + case DirectionW::Down: { + std::cout << "Direction is down" << std::endl; + break; + } + case DirectionW::Left: { + std::cout << "Direction is left" << std::endl; + break; + } + case DirectionW::Right: { + std::cout << "Direction is right" << std::endl; + break; + } + default: + break; } } void Wiazkowiec::setRandomDirection() { // Losowanie kierunku: 0 = Up, 1 = Down, 2 = Left, 3 = Right - int directionIndex = std::rand() % 4; - switch (directionIndex) { + int whatNumber = rand() % 4; + + switch (whatNumber) { case 0: direction = DirectionW::Up; - break; + break; case 1: direction = DirectionW::Down; - break; + break; case 2: direction = DirectionW::Left; - break; + break; case 3: direction = DirectionW::Right; - break; + break; + default: + break; } } -void Wiazkowiec::updateDirection() { +void Wiazkowiec::checkIfBeamShootOutOfBounds() { auto spriteBounds = actorSprite.getGlobalBounds(); // Pobierz rozmiar i pozycję sprite'a // Kontrola górnej i dolnej krawędzi @@ -106,17 +132,17 @@ 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); + if (static_cast(position.x) + deltaX < 0) { + deltaX = static_cast(-position.x); + } else if (static_cast(position.x) + spriteBounds.width + deltaX > static_cast(planszaWidth)) { + deltaX = static_cast(planszaWidth) - (static_cast(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); + if (static_cast(position.y) + deltaY < 0) { + deltaY = static_cast(-position.y); + } else if (static_cast(position.y) + spriteBounds.height + deltaY > static_cast(planszaHeight)) { + deltaY = static_cast(planszaHeight) - (static_cast(position.y) + spriteBounds.height); } actorSprite.move(deltaX, deltaY); @@ -133,42 +159,39 @@ void Wiazkowiec::update() { if (shooting) { // Kontrola zakończenia strzału if (shootingClock.getElapsedTime().asSeconds() >= beamDuration) { - beam.setVisible(false); shooting = false; + delete beam; + beam = nullptr; setRandomDirection(); // Zmień kierunek po strzale + } else { + window_ptr->draw(beam->getSprite()); } } else { - updateDirection(); + checkIfBeamShootOutOfBounds(); switch (direction) { case DirectionW::Up: moveUp(); - break; + break; case DirectionW::Down: moveDown(); - break; + break; case DirectionW::Left: moveLeft(); - break; + break; case DirectionW::Right: moveRight(); - break; + break; } - if (shootClock.getElapsedTime().asSeconds() >= 3.0f) { // Co 3 sekundy + if (shootClock.getElapsedTime().asSeconds() >= 3.0f) { + // Co 3 sekundy shoot(); shootClock.restart(); } } } -// Ustawianie widoczności wiązki podczas renderowania -void Wiazkowiec::render(sf::RenderWindow& window) { - if (beam.isVisible()) { - beam.render(window); - } -} - bool Wiazkowiec::isAlive() const { return alive; } @@ -184,6 +207,6 @@ bool Wiazkowiec::isShooting() const { return shooting; } -const Beam& Wiazkowiec::getBeam() const { +Beam* Wiazkowiec::getBeam() const { return beam; -} \ No newline at end of file +}