From 2234e4d973a21ba4d2f6e9d536fe03978a7e79e4 Mon Sep 17 00:00:00 2001 From: Kuba Date: Wed, 11 Dec 2024 16:33:24 +0100 Subject: [PATCH] Dodanie bombera --- CMakeLists.txt | 2 + assets/img/bullets/bomba.png | Bin 0 -> 11688 bytes assets/img/enemy/advanced_enemy.png | Bin 0 -> 11914 bytes assets/img/enemy/wiazkowiec.png | Bin 0 -> 8117 bytes headers/AdvancedEnemy.h | 1 + headers/Bomber.h | 41 +++++++ headers/Plansza.h | 8 +- sources/Bomber.cpp | 78 ++++++++++++++ sources/Plansza.cpp | 160 ++++++++++++++++++++++------ 9 files changed, 255 insertions(+), 35 deletions(-) create mode 100644 assets/img/bullets/bomba.png create mode 100644 assets/img/enemy/advanced_enemy.png create mode 100644 assets/img/enemy/wiazkowiec.png create mode 100644 headers/Bomber.h create mode 100644 sources/Bomber.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c301c75..34a32e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,8 @@ add_executable(LotoStatek main.cpp headers/Enemy.h headers/AdvancedEnemy.h sources/AdvancedEnemy.cpp + headers/Bomber.h + sources/Bomber.cpp ) if(WIN32) diff --git a/assets/img/bullets/bomba.png b/assets/img/bullets/bomba.png new file mode 100644 index 0000000000000000000000000000000000000000..6f09bde5ba7c15c065691487ee928457b00d3004 GIT binary patch literal 11688 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 L*DgAHCHQ{;Q&YXY literal 0 HcmV?d00001 diff --git a/headers/AdvancedEnemy.h b/headers/AdvancedEnemy.h index 09fe88f..769fa74 100644 --- a/headers/AdvancedEnemy.h +++ b/headers/AdvancedEnemy.h @@ -2,6 +2,7 @@ #define ADVANCED_ENEMY_H #include "Enemy.h" + #include enum class DirectionA { diff --git a/headers/Bomber.h b/headers/Bomber.h new file mode 100644 index 0000000..7f1a77c --- /dev/null +++ b/headers/Bomber.h @@ -0,0 +1,41 @@ +// +// Created by k on 11.12.2024. +// + +#ifndef BOMBER_H +#define BOMBER_H + +#include "Enemy.h" +#include "Actor.h" +enum class DirectionB { + Up, + Down, + Left, + Right +}; + +class Bomber : public Actor { +public: + Bomber(int x, int y, const sf::Texture& texture, const sf::Texture& bulletTexture); + + void shoot() override; + void move(float deltaX, float deltaY) override; + void moveLeft() override; + void moveRight() override; + void moveUp() override; + void moveDown() override; + + void update(); + + bool isAlive() const; + void takeDamage(); + void updateDirection(); + +private: + sf::Clock shootClock; + sf::Texture BombaTexture; + float movementSpeed = 2.0f; + bool alive = true; + DirectionB direction = DirectionB::Down; +}; +#endif //BOMBER_H diff --git a/headers/Plansza.h b/headers/Plansza.h index 4173def..b29e586 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -4,6 +4,7 @@ #include "Meteor.h" #include "Enemy.h" #include "AdvancedEnemy.h" +#include "Bomber.h" #include "RandomNumberGenerator.h" #include "SFML/System/Clock.hpp" #include "SFML/Graphics/RenderWindow.hpp" @@ -29,8 +30,9 @@ public: void update(); void spawn_enemy(); void setOutOfBounds(bool status); - void spawn_advanced_enemy(); + void spawn_wiazkowiec(); + void spawn_bomber(); private: Size size; @@ -40,17 +42,21 @@ private: sf::Texture meteorTexture1; sf::Texture meteorTexture2; sf::Texture enemyBulletTexture; + sf::Texture BombaTexture; sf::Texture playerTexture; sf::Texture playerBulletTexture; sf::Texture playerRocketTexture; sf::Texture enemyTexture; sf::Texture advancedEnemyTexture; + sf::Texture BomberEnemyTexture; sf::Clock spawnClock; sf::Clock shooterSpawnClock; std::vector enemies; std::vector AEnemies; + std::vector BEnemies; sf::Clock enemySpawnClock; sf::Clock AenemySpawnClock; + sf::Clock BomberSpawnClock; std::vector meteors; sf::RenderWindow *window; }; diff --git a/sources/Bomber.cpp b/sources/Bomber.cpp new file mode 100644 index 0000000..b909971 --- /dev/null +++ b/sources/Bomber.cpp @@ -0,0 +1,78 @@ +#include "../headers/Bomber.h" +#include "../headers/Bullet.h" + +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 = 2000; // Strzela co 2 + moving_speed = 2.0f; // Prędkość + BombaTexture.loadFromFile("../assets/img/bullets/bomba.png"); +} + +void Bomber::shoot() { + if (shootClock.getElapsedTime().asMilliseconds() >= firerate) { + Bullet Bbullet(position.x, position.y + actorSprite.getGlobalBounds().height / 2, BombaTexture); + Bbullet.setSpeed(0.5f); // Prędkość w dół + bullets.emplace_back(std::move(Bbullet)); + shootClock.restart(); + } +} + +void Bomber::updateDirection() { + // Zmieniamy kierunek przeciwnika, gdy dotrze do krawędzi + if (position.y <= 0) { + direction = DirectionB::Down; + } else if (position.y >= 800) { + direction = DirectionB::Up; + } + + // logika dla kierunku lewo/prawo + if (position.x <= 0) { + direction = DirectionB::Right; + } else if (position.x >= 1200) { + direction = DirectionB::Left; + } +} + +void Bomber::move(float deltaX, float deltaY) { + actorSprite.move(deltaX, deltaY); + position.x += static_cast(deltaX); + position.y += static_cast(deltaY); +} + +void Bomber::moveLeft() { move(-moving_speed, 0.0f); } +void Bomber::moveRight() { move(moving_speed, 0.0f); } +void Bomber::moveUp() { move(0.0f, -moving_speed); } +void Bomber::moveDown() { move(0.0f, moving_speed); } + +void Bomber::update() { + // Sprawdzamy, czy przeciwnik dotarł do krawędzi i zmieniamy kierunek + updateDirection(); + + switch (direction) { + case DirectionB::Up: + moveUp(); + break; + case DirectionB::Down: + moveDown(); + break; + case DirectionB::Left: + moveLeft(); + break; + case DirectionB::Right: + moveRight(); + break; + } +} + + +bool Bomber::isAlive() const { + return alive; +} + +void Bomber::takeDamage() { + if (--hp <= 0) { + alive = false; + } +} \ No newline at end of file diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 19727cb..9e91303 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -7,16 +7,14 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render const sf::Texture& playerTexture, const sf::Texture& playerBulletTexture, const sf::Texture& playerRocketTexture) -: background("../assets/img/background/background.png", 2.0f), -ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow->getSize().y) - 100, playerTexture, playerBulletTexture, playerRocketTexture) -{ - + : background("../assets/img/background/background.png", 2.0f), + ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow->getSize().y) - 100, + playerTexture, playerBulletTexture, playerRocketTexture) { window = mainWindow; size.height = static_cast(windowHeight); size.width = static_cast(windowWidth); - ship.setMovingSpeed(8); ship.setFirerate(200); @@ -28,7 +26,6 @@ ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow- audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3"); - meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); @@ -41,6 +38,10 @@ ship(static_cast(mainWindow->getSize().x) / 2, static_cast(mainWindow- std::cerr << "Failed to load advanced enemy texture!" << std::endl; exit(-1); } + if (!BomberEnemyTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png")) { + std::cerr << "Failed to load advanced enemy texture!" << std::endl; + exit(-1); + } spawnClock.restart(); } @@ -83,9 +84,11 @@ void Plansza::update() { } // generowanie nowego meteoru - spawn_meteor(); + //spawn_meteor(); spawn_enemy(); spawn_advanced_enemy(); + //spawn_wiazkowiec(); + spawn_bomber(); // utrzymanie meteorów i pocisków w ruchu for (auto& meteor : getMeteors()) { @@ -143,6 +146,7 @@ void Plansza::update() { } + if (!ship.isAlive()) { std::cout << "Game Over! Player is dead." << std::endl; std::cout << "You lost the game!\n"; @@ -216,6 +220,7 @@ void Plansza::update() { // Usunięcie martwych przeciwników if (!it->isAlive()) { + std::cout << "Basic Enemy has been eliminated." << std::endl; it = enemies.erase(it); } else { ++it; @@ -234,7 +239,21 @@ void Plansza::update() { ++it; } } - // std::cout << "Current AEnemies size: " << AEnemies.size() << std::endl; + for (auto it = BEnemies.begin(); it != BEnemies.end();) { + it->update(); // Ruch b + it->shoot(); // Strzał przeciwnika + + window->draw(it->getSprite()); // Rysowanie na ekranie + + if (!it->isAlive()) { + std::cout << "Bomber has been eliminated." << std::endl; + it = BEnemies.erase(it); // Usunięcie martwych przeciwników + } else { + ++it; + } + } + + // Obsługa pocisków zaawansowanych przeciwników for (auto& aEnemy : AEnemies) { for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { @@ -247,22 +266,25 @@ void Plansza::update() { } } - for (auto advancedIt = AEnemies.begin(); advancedIt != AEnemies.end();) { - 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); - advancedIt->takeDamage(); - hit = true; - break; + // Obsługa bomb + for (auto& aEnemy : BEnemies) { + for (auto it = aEnemy.getBullets().begin(); it != aEnemy.getBullets().end();) { + if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { + ship.takeDamage(); // Zadanie obrażeń graczowi + it = aEnemy.getBullets().erase(it); // Usuwanie pocisku po trafieniu } else { - ++bulletIt; + ++it; } } - if (hit && !advancedIt->isAlive()) { - advancedIt = AEnemies.erase(advancedIt); // Usunięcie przeciwnika AdvancedEnemy - } else { - ++advancedIt; + } + + + for (auto& enemy : enemies) { + enemy.shoot(); + enemy.updateBullets(); + for (auto& bullet : enemy.getBullets()) { + bullet.update(); + window->draw(bullet.getSprite()); } } @@ -274,6 +296,14 @@ void Plansza::update() { } } + for (auto& bomberEnemy : BEnemies) { + bomberEnemy.updateBullets(); // Obsługuje bomby + for (auto& bullet : bomberEnemy.getBullets()) { + bullet.update(); + window->draw(bullet.getSprite()); + } + } + for (auto& enemy : enemies) { for (auto it = enemy.getBullets().begin(); it != enemy.getBullets().end();) { if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) { @@ -290,16 +320,7 @@ void Plansza::update() { } } - for (auto& enemy : enemies) { - enemy.shoot(); - enemy.updateBullets(); - for (auto& bullet : enemy.getBullets()) { - bullet.update(); - window->draw(bullet.getSprite()); - } - } - - // Usuwanie pocisków, które są poza ekranem + // Usuwanie pocisków, które są poza ekranem srednio to dziala for (auto enemyIt = enemies.begin(); enemyIt != enemies.end(); ) { for (auto bulletIt = enemyIt->getBullets().begin(); bulletIt != enemyIt->getBullets().end();) { if (bulletIt->isOutOfBounds()) { @@ -331,6 +352,47 @@ void Plansza::update() { ++enemyIt; } } + + for (auto advancedIt = AEnemies.begin(); advancedIt != AEnemies.end();) { + 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); + advancedIt->takeDamage(); + hit = true; + break; + } else { + ++bulletIt; + } + } + if (hit && !advancedIt->isAlive()) { + advancedIt = AEnemies.erase(advancedIt); // Usunięcie przeciwnika AdvancedEnemy + } else { + ++advancedIt; + } + } + + for (auto bomberIt = BEnemies.begin(); bomberIt != BEnemies.end();) { + 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); + bomberIt->takeDamage(); + hit = true; + break; + } else { + ++bulletIt; + } + } + if (hit && !bomberIt->isAlive()) { + bomberIt = BEnemies.erase(bomberIt); // Usunięcie przeciwnika AdvancedEnemy + } else { + ++bomberIt; + } + } + + + //oblsuga dla rakiety for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { bool hit = false; @@ -370,6 +432,25 @@ void Plansza::update() { } } + for (auto bomberIt = BEnemies.begin(); bomberIt != BEnemies.end();) { + 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); + bomberIt->takeDamage(); + hit = true; + break; + } else { + ++rocketIt; + } + } + if (hit && !bomberIt->isAlive()) { + bomberIt = BEnemies.erase(bomberIt); + } else { + ++bomberIt; + } + } + } @@ -398,7 +479,7 @@ void Plansza::update_meteors() { } void Plansza::spawn_enemy() { - if (enemySpawnClock.getElapsedTime().asSeconds() >= 6) { // Spawn co 10 sekund + if (enemySpawnClock.getElapsedTime().asSeconds() >= 110) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); enemies.emplace_back(spawnX, -50, enemyTexture); @@ -408,14 +489,25 @@ void Plansza::spawn_enemy() { } void Plansza::spawn_advanced_enemy() { - if (AenemySpawnClock.getElapsedTime().asSeconds() >= 5) { // Spawn co 10 sekund + if (AenemySpawnClock.getElapsedTime().asSeconds() >= 100) { // Spawn co 10 sekund int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); - AEnemies.emplace_back(spawnX, 50, advancedEnemyTexture, enemyBulletTexture); + AEnemies.emplace_back(spawnX, -50, advancedEnemyTexture, enemyBulletTexture); std::cout << "Spawned Advanced Enemy at X: " << spawnX << std::endl; AenemySpawnClock.restart(); } } +void Plansza::spawn_bomber() { + if (BomberSpawnClock.getElapsedTime().asSeconds() >= 5) { // Spawn co 10 sekund + int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); + BEnemies.emplace_back(spawnX, -50, BomberEnemyTexture, BombaTexture); + std::cout << "Spawned Bomber Enemy at X: " << spawnX << std::endl; + BomberSpawnClock.restart(); + } +} + + + Size Plansza::getSize() {