diff --git a/CMakeLists.txt b/CMakeLists.txt index 02df20d..31a4846 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,9 @@ file(GLOB_RECURSE SOURCES ${PROJECT_SOURCE_DIR}/src/*.cpp) add_executable(${PROJECT_NAME} ${SOURCES} include/ProjectileComponent.h include/AssetManager.h - src/AssetManager.cpp) + src/AssetManager.cpp + include/HealthComponent.h +) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2main diff --git a/include/Components.h b/include/Components.h index 2f29913..a9e4591 100644 --- a/include/Components.h +++ b/include/Components.h @@ -6,4 +6,4 @@ #include "ColliderComponent.h" #include "TileComponent.h" #include "ProjectileComponent.h" - +#include "HealthComponent.h" diff --git a/include/Game.h b/include/Game.h index f680679..4a3f2e5 100644 --- a/include/Game.h +++ b/include/Game.h @@ -36,12 +36,18 @@ class Game GROUP_PLAYERS, GROUP_ENEMIES, GROUP_COLLIDERS, - PROJECTILE + PROJECTILE, + HEARTS }; + bool getWinner(); + private: int counter = 0; bool isRunning = false; SDL_Window* window; + + //true for player1 win / false for player2 win; + bool winner; }; diff --git a/include/HealthComponent.h b/include/HealthComponent.h new file mode 100644 index 0000000..ed18c5f --- /dev/null +++ b/include/HealthComponent.h @@ -0,0 +1,68 @@ +#include "Components.h" + +class HealthComponent : public Component { + +public: + + HealthComponent(int health, Manager* manager, bool player) : health(health), manager(manager), player(player) {} + + ~HealthComponent() {} + + void getDamage() { + this->health--; + } + + int getHealth() { + return this->health; + } + + void init() override + { + createAllHearts(); + } + + void update() override { + + } + + void createAllHearts() { + int x; + + if(player) { + x = 10; + } else { + x = 750; + } + + for(int i = 0; i < health; i++) { + if(player) { + createHeartComponents(x); + x += 50; + continue; + } + + createHeartComponents(x); + x -= 50; + } + } + + void createHeartComponents(int x) { + + auto& heart(manager->addEntity()); + heart.addComponent(x,5,1); + heart.addComponent("assets/chicken_neutral_knight.png"); + heart.addGroup(Game::HEARTS); + } + + +private: + + int health; + + TransformComponent* transformComponent; + + Manager* manager; + + bool player; //true if player1 / false if player2 + +}; \ No newline at end of file diff --git a/include/SpriteComponent.h b/include/SpriteComponent.h index 8ba9c26..2d92b4b 100644 --- a/include/SpriteComponent.h +++ b/include/SpriteComponent.h @@ -50,6 +50,7 @@ class SpriteComponent : public Component TextureManager::get().draw(this->texture, this->srcRect, this->destRect); } + private: TransformComponent* transform; SDL_Texture* texture; diff --git a/src/Game.cpp b/src/Game.cpp index 61e93df..c7ad6ac 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -6,6 +6,7 @@ #include "Vector2D.h" #include "AssetManager.h" + Map* map; Manager manager; @@ -20,7 +21,7 @@ std::vector Game::colliders; auto& player(manager.addEntity()); auto& enemy(manager.addEntity()); auto& wall(manager.addEntity()); -auto& projectile (manager.addEntity()); +//auto& projectile (manager.addEntity()); @@ -72,23 +73,27 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo //ecs implementation - player.addComponent(0,0,2); //posx, posy, scale + player.addComponent(80,80,2); //posx, posy, scale player.addComponent("assets/chicken_neutral_knight.png"); //adds sprite (32x32px), path needed player.addComponent(SDL_SCANCODE_W, SDL_SCANCODE_S, SDL_SCANCODE_A, SDL_SCANCODE_D, SDL_SCANCODE_E, Vector2D(1, 0));//custom keycontrols can be added player.addComponent("player"); //adds tag (for further use, reference tag) + player.addComponent(5, &manager, true); player.addGroup(GROUP_PLAYERS); //tell programm what group it belongs to for rendering order enemy.addComponent(600, 500, 2); enemy.addComponent("assets/chicken_neutral.png"); enemy.addComponent(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-1, 0)); enemy.addComponent("enemy"); + enemy.addComponent(5, &manager, false); enemy.addGroup(GROUP_ENEMIES); + } auto& tiles(manager.getGroup(Game::GROUP_MAP)); auto& players(manager.getGroup(Game::GROUP_PLAYERS)); auto& enemies(manager.getGroup(Game::GROUP_ENEMIES)); auto& projectiles(manager.getGroup(Game::PROJECTILE)); +auto& hearts(manager.getGroup(Game::HEARTS)); void Game::handleEvents() { @@ -132,6 +137,20 @@ void Game::update() //std::cout << "Enemy hit!"; p->getComponent().removeCollision(); p->destroy(); + + enemy.getComponent().getDamage(); + + for(auto h : hearts) + h->destroy(); + + player.getComponent().createAllHearts(); + enemy.getComponent().createAllHearts(); + + if(enemy.getComponent().getHealth() < 1) { + std::cout << "Player1 wins!" << std::endl; + winner = true; + isRunning = false; + } } if(SDL_HasIntersection(&player.getComponent().collider, &p->getComponent().collider) @@ -139,6 +158,20 @@ void Game::update() //std::cout << "Player hit!"; p->getComponent().removeCollision(); p->destroy(); + + player.getComponent().getDamage(); + + for(auto h : hearts) + h->destroy(); + + player.getComponent().createAllHearts(); + enemy.getComponent().createAllHearts(); + + if(player.getComponent().getHealth() < 1) { + std::cout << "Player2 wins!" << std::endl; + winner = false; + isRunning = false; + } } } @@ -163,6 +196,9 @@ void Game::render() for (auto& p : projectiles) p->draw(); + for (auto& h : hearts) + h->draw(); + SDL_RenderPresent(renderer); } @@ -185,4 +221,8 @@ void Game::addTile(int id, int x, int y) bool Game::running() { return isRunning; +} + +bool Game::getWinner() { + return this->winner; } \ No newline at end of file