From 13066709a72f41eef3cac58a4f48d00b342158af Mon Sep 17 00:00:00 2001 From: Kuba Date: Mon, 9 Dec 2024 17:36:57 +0100 Subject: [PATCH] Niby strzela, ale bez kolizji --- CMakeLists.txt | 2 ++ assets/img/bullets/enemy_bullet.png | Bin 0 -> 8535 bytes headers/Bullet.h | 2 ++ headers/Enemy.h | 14 +++++++++ headers/EnemyBullet.h | 14 +++++++++ headers/Plansza.h | 1 + sources/Actor.cpp | 12 +++++-- sources/Enemy.cpp | 47 ++++++++++++++++++++++++++-- sources/EnemyBullet.cpp | 18 +++++++++++ sources/Plansza.cpp | 24 +++++++++++++- 10 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 assets/img/bullets/enemy_bullet.png create mode 100644 headers/EnemyBullet.h create mode 100644 sources/EnemyBullet.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d09862e..56d75e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,8 @@ add_executable(LotoStatek main.cpp sources/ObjectItem.cpp sources/Enemy.cpp headers/Enemy.h + headers/EnemyBullet.h + sources/EnemyBullet.cpp ) if(WIN32) diff --git a/assets/img/bullets/enemy_bullet.png b/assets/img/bullets/enemy_bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..5574a54bfe36131185de7dedf79f78f96647a456 GIT binary patch literal 8535 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 + Actor::Actor(int x, int y, std::string path) { loadTexture(path); position.x = x; @@ -29,13 +31,17 @@ std::vector &Actor::getBullets() { } void Actor::updateBullets() { - for (auto& bullet : bullets) { - if(bullet.isOutOfBounds()) { - bullets.erase(bullets.begin()); + for (auto it = bullets.begin(); it != bullets.end(); ) { + if (it->isOutOfBounds()) { + it = bullets.erase(it); // Usuwa element i zwraca iterator na następny element + } else { + ++it; // Przechodzi do następnego elementu } } + std::cout << "Liczba pociskow: " << bullets.size() << std::endl; } + void Actor::setMovingSpeed(float speed) { moving_speed = speed; } diff --git a/sources/Enemy.cpp b/sources/Enemy.cpp index db69af5..7404e50 100644 --- a/sources/Enemy.cpp +++ b/sources/Enemy.cpp @@ -3,28 +3,71 @@ Enemy::Enemy(int x, int y, std::string path) : Actor(x, y, path) { hp = 1; // Przeciwnik ma 1 punkt życia - firerate = 1000; // Strzela co 1 sekundę + firerate = 2000; // Strzela co 1 sekundę moving_speed = 2.0f; // Prędkość ruchu przeciwnika + enemyBulletTexture.loadFromFile("../assets/img/bullets/enemy_bullet.png"); } void Enemy::shoot() { if (shootClock.getElapsedTime().asMilliseconds() >= firerate) { - bullets.emplace_back(position.x, position.y + 20, bulletTextureLeft); // Strzał w dół + Bullet bullet(position.x, position.y + actorSprite.getGlobalBounds().height / 2, enemyBulletTexture); + bullet.setSpeed(10.0f); // Prędkość w dół + bullets.emplace_back(std::move(bullet)); shootClock.restart(); } } +void Enemy::updateDirection() { + // Zmieniamy kierunek przeciwnika, gdy dotrze do krawędzi + if (position.y <= 0) { // Górna krawędź ekranu + direction = Direction::Down; // Zmieniamy na ruch w dół + } else if (position.y >= 800) { // Dolna krawędź ekranu + direction = Direction::Up; // Zmieniamy na ruch w górę + } + + // Podobna logika dla kierunku lewo/prawo, jeśli przeciwnik będzie się poruszał w poziomie + if (position.x <= 0) { // Lewa krawędź + direction = Direction::Right; // Zmieniamy na ruch w prawo + } else if (position.x >= 1200) { // Prawa krawędź + direction = Direction::Left; // Zmieniamy na ruch w lewo + } +} + void Enemy::move(float deltaX, float deltaY) { actorSprite.move(deltaX, deltaY); position.x += static_cast(deltaX); position.y += static_cast(deltaY); } + + void Enemy::moveLeft() { move(-moving_speed, 0.0f); } void Enemy::moveRight() { move(moving_speed, 0.0f); } void Enemy::moveUp() { move(0.0f, -moving_speed); } void Enemy::moveDown() { move(0.0f, moving_speed); } +void Enemy::update() { + // Sprawdzamy, czy przeciwnik dotarł do krawędzi i zmieniamy kierunek + updateDirection(); + + // Zgodnie z kierunkiem, poruszamy przeciwnikiem + switch (direction) { + case Direction::Up: + moveUp(); + break; + case Direction::Down: + moveDown(); + break; + case Direction::Left: + moveLeft(); + break; + case Direction::Right: + moveRight(); + break; + } +} + + bool Enemy::isAlive() const { return alive; } diff --git a/sources/EnemyBullet.cpp b/sources/EnemyBullet.cpp new file mode 100644 index 0000000..67955fd --- /dev/null +++ b/sources/EnemyBullet.cpp @@ -0,0 +1,18 @@ +#include "../headers/EnemyBullet.h" + +EnemyBullet::EnemyBullet(float x, float y, sf::Texture &texture) + : Projectile(x, y, texture) { + speed = 5.0f; // Ruch w dół (dodatnia prędkość) +} + +void EnemyBullet::update() { + sprite.move(0.0f, speed); // Przesuwanie pocisku w dół + position.y += speed; + + if (position.y > 800) { + outOfBounds = true; + } +} +void EnemyBullet::setOutOfBounds(bool status) { + outOfBounds = status; +} \ No newline at end of file diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 8e62473..d9f3a7b 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -159,7 +159,7 @@ void Plansza::update() { } // Ruch i renderowanie przeciwników for (auto it = enemies.begin(); it != enemies.end();) { - it->moveDown(); // Przeciwnicy poruszają się w dół + it->update(); // Aktualizacja kierunku i ruchu przeciwnika it->shoot(); // Rysowanie przeciwników @@ -173,6 +173,28 @@ void Plansza::update() { } } + for (auto& enemy : enemies) { // Lista przeciwników w grze + enemy.shoot(); + enemy.updateBullets(); + for (auto& bullet : enemy.getBullets()) { + bullet.update(); + window->draw(bullet.getSprite()); + } + } + + // Usuwanie pocisków, które są poza ekranem + for (auto enemyIt = enemies.begin(); enemyIt != enemies.end(); ) { + for (auto bulletIt = enemyIt->getBullets().begin(); bulletIt != enemyIt->getBullets().end();) { + if (bulletIt->isOutOfBounds()) { + bulletIt = enemyIt->getBullets().erase(bulletIt); // Usuwamy pocisk, który wyszedł poza ekran + } else { + ++bulletIt; + } + } + ++enemyIt; + } + + // Kolizje między pociskami gracza a przeciwnikami for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { bool hit = false;