0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 21:23:41 +00:00

added health, getting damage and visual

representation of it
This commit is contained in:
Markus 2024-01-22 17:39:47 -06:00
parent acbea34632
commit 7c87ccc42b
6 changed files with 122 additions and 5 deletions

View File

@ -31,7 +31,9 @@ file(GLOB_RECURSE SOURCES ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_executable(${PROJECT_NAME} ${SOURCES} add_executable(${PROJECT_NAME} ${SOURCES}
include/ProjectileComponent.h include/ProjectileComponent.h
include/AssetManager.h include/AssetManager.h
src/AssetManager.cpp) src/AssetManager.cpp
include/HealthComponent.h
)
target_link_libraries(${PROJECT_NAME} PRIVATE target_link_libraries(${PROJECT_NAME} PRIVATE
SDL2::SDL2main SDL2::SDL2main

View File

@ -6,4 +6,4 @@
#include "ColliderComponent.h" #include "ColliderComponent.h"
#include "TileComponent.h" #include "TileComponent.h"
#include "ProjectileComponent.h" #include "ProjectileComponent.h"
#include "HealthComponent.h"

View File

@ -36,12 +36,18 @@ class Game
GROUP_PLAYERS, GROUP_PLAYERS,
GROUP_ENEMIES, GROUP_ENEMIES,
GROUP_COLLIDERS, GROUP_COLLIDERS,
PROJECTILE PROJECTILE,
HEARTS
}; };
bool getWinner();
private: private:
int counter = 0; int counter = 0;
bool isRunning = false; bool isRunning = false;
SDL_Window* window; SDL_Window* window;
//true for player1 win / false for player2 win;
bool winner;
}; };

68
include/HealthComponent.h Normal file
View File

@ -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<TransformComponent>(x,5,1);
heart.addComponent<SpriteComponent>("assets/chicken_neutral_knight.png");
heart.addGroup(Game::HEARTS);
}
private:
int health;
TransformComponent* transformComponent;
Manager* manager;
bool player; //true if player1 / false if player2
};

View File

@ -50,6 +50,7 @@ class SpriteComponent : public Component
TextureManager::get().draw(this->texture, this->srcRect, this->destRect); TextureManager::get().draw(this->texture, this->srcRect, this->destRect);
} }
private: private:
TransformComponent* transform; TransformComponent* transform;
SDL_Texture* texture; SDL_Texture* texture;

View File

@ -6,6 +6,7 @@
#include "Vector2D.h" #include "Vector2D.h"
#include "AssetManager.h" #include "AssetManager.h"
Map* map; Map* map;
Manager manager; Manager manager;
@ -20,7 +21,7 @@ std::vector<ColliderComponent*> Game::colliders;
auto& player(manager.addEntity()); auto& player(manager.addEntity());
auto& enemy(manager.addEntity()); auto& enemy(manager.addEntity());
auto& wall(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 //ecs implementation
player.addComponent<TransformComponent>(0,0,2); //posx, posy, scale player.addComponent<TransformComponent>(80,80,2); //posx, posy, scale
player.addComponent<SpriteComponent>("assets/chicken_neutral_knight.png"); //adds sprite (32x32px), path needed player.addComponent<SpriteComponent>("assets/chicken_neutral_knight.png"); //adds sprite (32x32px), path needed
player.addComponent<KeyboardController>(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<KeyboardController>(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<ColliderComponent>("player"); //adds tag (for further use, reference tag) player.addComponent<ColliderComponent>("player"); //adds tag (for further use, reference tag)
player.addComponent<HealthComponent>(5, &manager, true);
player.addGroup(GROUP_PLAYERS); //tell programm what group it belongs to for rendering order player.addGroup(GROUP_PLAYERS); //tell programm what group it belongs to for rendering order
enemy.addComponent<TransformComponent>(600, 500, 2); enemy.addComponent<TransformComponent>(600, 500, 2);
enemy.addComponent<SpriteComponent>("assets/chicken_neutral.png"); enemy.addComponent<SpriteComponent>("assets/chicken_neutral.png");
enemy.addComponent<KeyboardController>(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-1, 0)); enemy.addComponent<KeyboardController>(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-1, 0));
enemy.addComponent<ColliderComponent>("enemy"); enemy.addComponent<ColliderComponent>("enemy");
enemy.addComponent<HealthComponent>(5, &manager, false);
enemy.addGroup(GROUP_ENEMIES); enemy.addGroup(GROUP_ENEMIES);
} }
auto& tiles(manager.getGroup(Game::GROUP_MAP)); auto& tiles(manager.getGroup(Game::GROUP_MAP));
auto& players(manager.getGroup(Game::GROUP_PLAYERS)); auto& players(manager.getGroup(Game::GROUP_PLAYERS));
auto& enemies(manager.getGroup(Game::GROUP_ENEMIES)); auto& enemies(manager.getGroup(Game::GROUP_ENEMIES));
auto& projectiles(manager.getGroup(Game::PROJECTILE)); auto& projectiles(manager.getGroup(Game::PROJECTILE));
auto& hearts(manager.getGroup(Game::HEARTS));
void Game::handleEvents() void Game::handleEvents()
{ {
@ -132,6 +137,20 @@ void Game::update()
//std::cout << "Enemy hit!"; //std::cout << "Enemy hit!";
p->getComponent<ColliderComponent>().removeCollision(); p->getComponent<ColliderComponent>().removeCollision();
p->destroy(); p->destroy();
enemy.getComponent<HealthComponent>().getDamage();
for(auto h : hearts)
h->destroy();
player.getComponent<HealthComponent>().createAllHearts();
enemy.getComponent<HealthComponent>().createAllHearts();
if(enemy.getComponent<HealthComponent>().getHealth() < 1) {
std::cout << "Player1 wins!" << std::endl;
winner = true;
isRunning = false;
}
} }
if(SDL_HasIntersection(&player.getComponent<ColliderComponent>().collider, &p->getComponent<ColliderComponent>().collider) if(SDL_HasIntersection(&player.getComponent<ColliderComponent>().collider, &p->getComponent<ColliderComponent>().collider)
@ -139,6 +158,20 @@ void Game::update()
//std::cout << "Player hit!"; //std::cout << "Player hit!";
p->getComponent<ColliderComponent>().removeCollision(); p->getComponent<ColliderComponent>().removeCollision();
p->destroy(); p->destroy();
player.getComponent<HealthComponent>().getDamage();
for(auto h : hearts)
h->destroy();
player.getComponent<HealthComponent>().createAllHearts();
enemy.getComponent<HealthComponent>().createAllHearts();
if(player.getComponent<HealthComponent>().getHealth() < 1) {
std::cout << "Player2 wins!" << std::endl;
winner = false;
isRunning = false;
}
} }
} }
@ -163,6 +196,9 @@ void Game::render()
for (auto& p : projectiles) for (auto& p : projectiles)
p->draw(); p->draw();
for (auto& h : hearts)
h->draw();
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
@ -186,3 +222,7 @@ bool Game::running()
{ {
return isRunning; return isRunning;
} }
bool Game::getWinner() {
return this->winner;
}