#include "../headers/Boss.h" #include #include #include "../headers/RandomNumberGenerator.h" Boss::Boss(int x, int y, const sf::Texture& bossTexture, const sf::Texture& bulletTexture, const sf::Texture BombaTexture, sf::RenderWindow* window) : Actor(x, y, bossTexture), bulletTexture(bulletTexture), BombaTexture(BombaTexture), window(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 = 100; firerate = 2000; } void Boss::shoot() { if (shootClock.getElapsedTime().asMilliseconds() >= firerate) { Bullet leftBullet(position.x - 20, position.y, bulletTexture); leftBullet.setSpeed(5.0f); Bullet centerBullet(position.x, position.y, bulletTexture); centerBullet.setSpeed(5.0f); Bullet rightBullet(position.x + 20, position.y, bulletTexture); rightBullet.setSpeed(5.0f); bullets.push_back(std::move(leftBullet)); bullets.push_back(std::move(centerBullet)); bullets.push_back(std::move(rightBullet)); std::cout << "Strzal lezy" << std::endl; shootClock.restart(); } } void Boss::dropBomb() { if (bombClock.getElapsedTime().asMilliseconds() >= 5000) { Bullet Bomb(position.x, position.y, BombaTexture); Bomb.setSpeed(0.1f); bullets.emplace_back(std::move(Bomb)); // Można zmienić na bombę std::cout << "Bombka lezy" << std::endl; bombClock.restart(); } } void Boss::shootLaser() { if (!laserBeam && laserClock.getElapsedTime().asSeconds() >= 5.0f) { laserBeam = new Beam(position.x, position.y, beamTexture); beamDurationClock.restart(); laserClock.restart(); } if (laserBeam) { window->draw(laserBeam->getSprite()); std::cout << "Laser beam shooted" << std::endl; if (beamDurationClock.getElapsedTime().asSeconds() >= beamDuration) { delete laserBeam; laserBeam = nullptr; } } } void Boss::move(float deltaX, float deltaY) { actorSprite.move(deltaX, deltaY); position.x += static_cast(deltaX); position.y += static_cast(deltaY); handleBounds(); } void Boss::update() { if (directionClock.getElapsedTime().asSeconds() >= 3.0f) { setRandomDirection(); directionClock.restart(); } switch (direction) { case BossDirection::Up: move(0, -movementSpeed); break; case BossDirection::Down: move(0, movementSpeed); break; case BossDirection::Left: move(-movementSpeed, 0); break; case BossDirection::Right: move(movementSpeed, 0); break; } shoot(); dropBomb(); shootLaser(); // Aktualizacja pocisków for (auto it = bullets.begin(); it != bullets.end();) { it->update(); window->draw(it->getSprite()); if (it->isOutOfBounds()) { it = bullets.erase(it); } else { ++it; } } // Aktualizacja bomb for (auto it = bombs.begin(); it != bombs.end();) { it->update(); window->draw(it->getSprite()); if (it->isOutOfBounds()) { it = bombs.erase(it); } else { ++it; } } } void Boss::moveLeft() { move(-movementSpeed, 0.0f); } void Boss::moveRight() { move(movementSpeed, 0.0f); } void Boss::moveUp() { move(0.0f, -movementSpeed); } void Boss::moveDown() { move(0.0f, movementSpeed); } void Boss::takeDamage() { if (--hp <= 0) { hp = 0; } } bool Boss::isAlive() const { return hp > 0; } void Boss::setRandomDirection() { int randomValue = RandomNumberGenerator::getRandomNumber(0, 3); direction = static_cast(randomValue); } void Boss::handleBounds() { if (position.x <= 0) direction = BossDirection::Right; if (position.x >= 300) direction = BossDirection::Left; if (position.y <= 0) direction = BossDirection::Down; if (position.y >= 300) direction = BossDirection::Up; }