From c655409596961ad6fd0a6108e5c77a45b7ac593d Mon Sep 17 00:00:00 2001 From: Kuba Date: Mon, 9 Dec 2024 16:48:31 +0100 Subject: [PATCH] =?UTF-8?q?Jakie=C5=9B=20dzia=C5=82aj=C4=85ce=20g=C3=B3wno?= =?UTF-8?q?=20Ale=20nie=20strzela=20chujek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 5 ++++- headers/Enemy.h | 25 +++++++++++++++++++++++++ headers/Plansza.h | 7 +++++++ sources/Enemy.cpp | 36 ++++++++++++++++++++++++++++++++++++ sources/Plansza.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 headers/Enemy.h create mode 100644 sources/Enemy.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eacb45..d09862e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,10 @@ add_executable(LotoStatek main.cpp headers/Size.h headers/Position.h headers/ObjectItem.hpp - sources/ObjectItem.cpp) + sources/ObjectItem.cpp + sources/Enemy.cpp + headers/Enemy.h +) if(WIN32) set(SFML_ROOT "${CMAKE_SOURCE_DIR}/lib/SFML") diff --git a/headers/Enemy.h b/headers/Enemy.h new file mode 100644 index 0000000..c9ec2a3 --- /dev/null +++ b/headers/Enemy.h @@ -0,0 +1,25 @@ +#ifndef ENEMY_H +#define ENEMY_H + +#include "Actor.h" +#include "SFML/System/Clock.hpp" + +class Enemy : public Actor { +public: + Enemy(int x, int y, std::string path); + + void shoot() override; + void move(float deltaX, float deltaY) override; + void moveLeft() override; + void moveRight() override; + void moveUp() override; + void moveDown() override; + bool isAlive() const; + void takeDamage(); + +private: + sf::Clock shootClock; + bool alive = true; +}; + +#endif // ENEMY_H diff --git a/headers/Plansza.h b/headers/Plansza.h index 0971823..9a46da7 100644 --- a/headers/Plansza.h +++ b/headers/Plansza.h @@ -2,6 +2,7 @@ #define PLANSZA_H #include "Meteor.h" +#include "Enemy.h" #include "RandomNumberGenerator.h" #include "SFML/System/Clock.hpp" #include "SFML/Graphics/RenderWindow.hpp" @@ -18,9 +19,12 @@ public: Plansza(unsigned int windowHeight,unsigned int windowWidth, sf::RenderWindow *mainWindow); Size getSize(); std::vector &getMeteors(); + + void spawn_meteor(); void update_meteors(); void update(); + void spawn_enemy(); private: Size size; Background background; @@ -29,6 +33,9 @@ private: sf::Texture meteorTexture1; sf::Texture meteorTexture2; sf::Clock spawnClock; + sf::Clock shooterSpawnClock; + std::vector enemies; + sf::Clock enemySpawnClock; std::vector meteors; sf::RenderWindow *window; }; diff --git a/sources/Enemy.cpp b/sources/Enemy.cpp new file mode 100644 index 0000000..db69af5 --- /dev/null +++ b/sources/Enemy.cpp @@ -0,0 +1,36 @@ +#include "../headers/Enemy.h" +#include "../headers/Bullet.h" + +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ę + moving_speed = 2.0f; // Prędkość ruchu przeciwnika +} + +void Enemy::shoot() { + if (shootClock.getElapsedTime().asMilliseconds() >= firerate) { + bullets.emplace_back(position.x, position.y + 20, bulletTextureLeft); // Strzał w dół + shootClock.restart(); + } +} + +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); } + +bool Enemy::isAlive() const { + return alive; +} + +void Enemy::takeDamage() { + if (--hp <= 0) { + alive = false; + } +} diff --git a/sources/Plansza.cpp b/sources/Plansza.cpp index 5183a91..8e62473 100644 --- a/sources/Plansza.cpp +++ b/sources/Plansza.cpp @@ -67,7 +67,7 @@ void Plansza::update() { // generowanie nowego meteoru spawn_meteor(); - + spawn_enemy(); // utrzymanie meteorów i pocisków w ruchu for (auto& meteor : getMeteors()) { @@ -157,6 +157,41 @@ void Plansza::update() { ++meteorIt; } } + // Ruch i renderowanie przeciwników + for (auto it = enemies.begin(); it != enemies.end();) { + it->moveDown(); // Przeciwnicy poruszają się w dół + it->shoot(); + + // Rysowanie przeciwników + window->draw(it->getSprite()); + + // Usunięcie martwych przeciwników + if (!it->isAlive()) { + it = enemies.erase(it); + } else { + ++it; + } + } + + // Kolizje między pociskami gracza a przeciwnikami + for (auto enemyIt = enemies.begin(); enemyIt != enemies.end();) { + 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); + enemyIt->takeDamage(); + hit = true; + break; + } else { + ++bulletIt; + } + } + if (hit && !enemyIt->isAlive()) { + enemyIt = enemies.erase(enemyIt); + } else { + ++enemyIt; + } + } } // Meteor-related niżej @@ -183,6 +218,14 @@ void Plansza::update_meteors() { } } +void Plansza::spawn_enemy() { + if (enemySpawnClock.getElapsedTime().asSeconds() >= 10) { // Spawn co 10 sekund + int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50); + enemies.emplace_back(spawnX, -50, "../assets/img/enemy/enemy.png"); + enemySpawnClock.restart(); + } +} + Size Plansza::getSize() { return size; }