Boss utworzony, strzela, bombuje, wiazkuje(#KolizjaToDo)
This commit is contained in:
149
sources/Boss.cpp
Normal file
149
sources/Boss.cpp
Normal file
@@ -0,0 +1,149 @@
|
||||
#include "../headers/Boss.h"
|
||||
#include <random>
|
||||
#include <iostream>
|
||||
#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<int>(deltaX);
|
||||
position.y += static_cast<int>(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<BossDirection>(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;
|
||||
}
|
||||
Reference in New Issue
Block a user