diff --git a/include/AnimationHandler.h b/include/AnimationHandler.h index 069fc2f..b05a1d6 100644 --- a/include/AnimationHandler.h +++ b/include/AnimationHandler.h @@ -16,11 +16,5 @@ struct Animation } }; -enum AnimationType //TODO enum class -{ - IDLE = 0, - WALK = 1 -}; - diff --git a/include/Constants.h b/include/Constants.h index 20ccf44..8237a71 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -24,7 +24,3 @@ constexpr int MAP_SIZE_Y = 20; constexpr int SPAWN_ATTEMPTS = 20; -constexpr int BUFF_DURATION = 240; - -constexpr int BUFF_VALUE = 1; - diff --git a/include/GameInternal.h b/include/GameInternal.h index 8cd806c..fc6957e 100644 --- a/include/GameInternal.h +++ b/include/GameInternal.h @@ -32,7 +32,8 @@ public: void update(); void render(); void clean(); - bool running() const; + bool isRunning() const; + void setRunning(bool running); /* static */ SDL_Renderer* renderer = nullptr; /* static */ SDL_Event event; @@ -45,11 +46,6 @@ public: Manager manager; Map* map; // game specific, might not be needed for all types of games - Entity& player1; - Entity& player2; - - Entity& wall; - std::vector& tiles; std::vector& players; std::vector& projectiles; @@ -66,7 +62,7 @@ private: Game* gameInstance; int counter = 0; - bool isRunning = false; + bool running = false; SDL_Window* window; Entity::TeamLabel winner; }; diff --git a/include/HealthComponent.h b/include/HealthComponent.h index fad7a23..1d57330 100644 --- a/include/HealthComponent.h +++ b/include/HealthComponent.h @@ -1,5 +1,6 @@ #pragma once +#include #include "Direction.h" #include "Component.h" @@ -9,7 +10,7 @@ class HealthComponent : public Component { public: - HealthComponent(int health, Direction side) : health(health), side(side) {} + HealthComponent(int health, Direction side, std::string healthTexture) : health(health), side(side), healthTexture(healthTexture) {} ~HealthComponent() {} void modifyHealth(int health = -1); @@ -26,4 +27,5 @@ private: int health; Direction side; + std::string healthTexture; }; \ No newline at end of file diff --git a/include/SpriteComponent.h b/include/SpriteComponent.h index a957ade..ed584a2 100644 --- a/include/SpriteComponent.h +++ b/include/SpriteComponent.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "AnimationHandler.h" #include "Component.h" @@ -15,7 +16,7 @@ class SpriteComponent : public Component public: int animationIndex = 0; - std::map> animations; + std::map>* animations = nullptr; private: TransformComponent* transform; @@ -32,7 +33,11 @@ private: public: SpriteComponent() = default; SpriteComponent(const char* path); - SpriteComponent(const char* path, bool isAnimated); + SpriteComponent( + const char* path, + bool isAnimated, + std::map>* animationList, + std::string defaultAnimation); ~SpriteComponent(); void setTexture(const char* path); @@ -40,6 +45,6 @@ public: void init() override; void update() override; void draw() override; - void playAnimation(AnimationType type); + void playAnimation(std::string type); void setDirection(Direction direction); }; diff --git a/include/StatEffectsComponent.h b/include/StatEffectsComponent.h index 9daa19d..bc93f2b 100644 --- a/include/StatEffectsComponent.h +++ b/include/StatEffectsComponent.h @@ -18,9 +18,10 @@ public: void init() override; void update() override; - void modifyStatDur(Stats stat, int duration); + void modifyStatDur(Stats stat, int duration, int value); void modifyStatValue(Stats stat, int modifier); + void resetStatValue(Stats stat); private: std::array buffs = { 0 }; diff --git a/include/TransformComponent.h b/include/TransformComponent.h index c88a81d..14afe87 100644 --- a/include/TransformComponent.h +++ b/include/TransformComponent.h @@ -14,7 +14,8 @@ public: int width = 32; int scale = 1; - int speed = 3; + int getSpeed() { return speed + speedMod; }; + void resetSpeedMod() { speedMod = 0; }; TransformComponent(); explicit TransformComponent(int scale); @@ -26,4 +27,8 @@ public: void update() override; void setPositionAfterCollision(Vector2D& positionChange); void modifySpeed(int8_t modifier); + +private: + int speed = 3; + int speedMod = 0; }; diff --git a/src/Entity.cpp b/src/Entity.cpp index 7ed2f32..2f2075f 100644 --- a/src/Entity.cpp +++ b/src/Entity.cpp @@ -30,7 +30,7 @@ void Entity::delGroup(Group mGroup) groupBitSet[mGroup] = false; } -std::bitset Entity::getGroupBitSet() +std::bitset Entity::getGroupBitSet() { return groupBitSet; } diff --git a/src/GameInternal.cpp b/src/GameInternal.cpp index 148a32e..5a490a8 100644 --- a/src/GameInternal.cpp +++ b/src/GameInternal.cpp @@ -19,14 +19,13 @@ GameInternal::GameInternal() : manager(this), - tiles(manager.getGroup((size_t)Entity::GroupLabel::MAPTILES)), + tiles(manager.getGroup((size_t)Entity::GroupLabel::MAPTILES)), players(manager.getGroup((size_t)Entity::GroupLabel::PLAYERS)), projectiles(manager.getGroup((size_t)Entity::GroupLabel::PROJECTILE)), hearts(manager.getGroup((size_t)Entity::GroupLabel::HEARTS)), - powerups(manager.getGroup((size_t)Entity::GroupLabel::POWERUPS)), - player1(manager.addEntity()), - player2(manager.addEntity()), - wall(manager.addEntity()) + powerups(manager.getGroup((size_t)Entity::GroupLabel::POWERUPS)) + //player1(manager.addEntity()), + //player2(manager.addEntity()) {}; GameInternal::~GameInternal() = default; @@ -104,7 +103,7 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he while (!hasQuit) { SDL_PollEvent(&event); - + if (event.type == SDL_QUIT) { hasQuit = true; @@ -129,7 +128,7 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he if (hasQuit) { - this->isRunning = false; + this->setRunning(false); return; } @@ -140,7 +139,7 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he const char* player2Sprite; selectCharacters(player1Sprite, player2Sprite); - if (this->isRunning == false) return; + if (this->isRunning() == false) return; map = new Map(); @@ -158,26 +157,24 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he //ecs implementation - player1.setTeam(Entity::TeamLabel::BLUE); - player1.addComponent(80,80,2); //posx, posy, scale - player1.addComponent(player1Sprite, true); //adds sprite (32x32px), path needed + // player1.setTeam(Entity::TeamLabel::BLUE); + // player1.addComponent(80,80,2); //posx, posy, scale + // player1.addComponent(player1Sprite, true); //adds sprite (32x32px), path needed // player1.addComponent(SDL_SCANCODE_W, SDL_SCANCODE_S, SDL_SCANCODE_A, SDL_SCANCODE_D, SDL_SCANCODE_E, Vector2D(2, 0));//custom keycontrols can be added - player1.addComponent(); - player1.addComponent("player", 0.8f); //adds tag (for further use, reference tag) - player1.addComponent(5, Direction::LEFT); - player1.addComponent(); - player1.addGroup((size_t) Entity::GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order + // player1.addComponent("player", 0.8f); //adds tag (for further use, reference tag) + // player1.addComponent(5, Direction::LEFT, "assets/heart.png"); + // player1.addComponent(); + // player1.addGroup((size_t) Entity::GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order - player2.setTeam(Entity::TeamLabel::RED); - player2.addComponent(600, 500, 2); - player2.addComponent(player2Sprite, true); + // player2.setTeam(Entity::TeamLabel::RED); + // player2.addComponent(600, 500, 2); + // player2.addComponent(player2Sprite, true); // player2.addComponent(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-2, 0)); - player2.addComponent(); - player2.addComponent("enemy", 0.8f); - player2.addComponent(5, Direction::RIGHT); - player2.addComponent(); - player2.addGroup((size_t) Entity::GroupLabel::PLAYERS); + // player2.addComponent("enemy", 0.8f); + // player2.addComponent(5, Direction::RIGHT, "assets/heart.png"); + // player2.addComponent(); + // player2.addGroup((size_t) Entity::GroupLabel::PLAYERS); this->gameInstance = GameFactory::instance().create("Chickengame", this); //!< \todo Should be specified via a config file this->gameInstance->init(); @@ -270,13 +267,13 @@ void GameInternal::selectCharacters(const char* &playerSprite, const char* &enem if (hasQuit) { - this->isRunning = false; + this->setRunning(false); return; } playerSprite = characterSprites.find(playerSelection)->second.second; enemySprite = characterSprites.find(enemySelection)->second.second; - this->isRunning = true; + this->setRunning(true); } void GameInternal::handleEvents() @@ -285,7 +282,7 @@ void GameInternal::handleEvents() switch (event.type) { - case SDL_QUIT: this->isRunning = false; + case SDL_QUIT: this->setRunning(false); break; default: @@ -312,7 +309,7 @@ void GameInternal::render() for (auto& p : players) p->draw(); - + for (auto& p : projectiles) p->draw(); @@ -331,15 +328,20 @@ void GameInternal::clean() std::cout << "Game Cleaned!" << std::endl; } -bool GameInternal::running() const +bool GameInternal::isRunning() const { - return isRunning; + return running; +} + +void GameInternal::setRunning(bool running) +{ + this->running = running; } void GameInternal::setWinner(Entity::TeamLabel winningTeam) { this->winner = winningTeam; - this->isRunning = false; + this->setRunning(false); } Entity::TeamLabel GameInternal::getWinner() const diff --git a/src/HealthComponent.cpp b/src/HealthComponent.cpp index ead3412..6294e97 100644 --- a/src/HealthComponent.cpp +++ b/src/HealthComponent.cpp @@ -57,7 +57,7 @@ void HealthComponent::createHeartComponents(int x) { auto& heart(this->entity->getManager().addEntity()); heart.addComponent(x,5,2); - heart.addComponent("assets/heart.png"); + heart.addComponent(this->healthTexture.data()); heart.addGroup((size_t)Entity::GroupLabel::HEARTS); heart.setTeam(this->entity->getTeam()); } \ No newline at end of file diff --git a/src/SpriteComponent.cpp b/src/SpriteComponent.cpp index 9dea93e..845dfd1 100644 --- a/src/SpriteComponent.cpp +++ b/src/SpriteComponent.cpp @@ -17,14 +17,17 @@ SpriteComponent::SpriteComponent(const char* path) this->texturePath = path; } -SpriteComponent::SpriteComponent(const char* path, bool isAnimated) +SpriteComponent::SpriteComponent( + const char* path, + bool isAnimated, + std::map>* animationMap, + std::string defaultAnimation) { animated = isAnimated; - animations.emplace(IDLE, std::make_unique((uint8_t)AnimationType::IDLE, 2, 200)); - animations.emplace(WALK, std::make_unique((uint8_t)AnimationType::WALK, 2, 200)); + animations = animationMap; - playAnimation(IDLE); + playAnimation(defaultAnimation); this->texturePath = path; } @@ -71,14 +74,14 @@ void SpriteComponent::draw() this->entity->getManager().getGame()->textureManager->draw(this->entity->getManager().getGame()->renderer, this->texture, this->srcRect, this->destRect, this->animated && this->flipped); } -void SpriteComponent::playAnimation(AnimationType type) +void SpriteComponent::playAnimation(std::string type) { - this->animationIndex = animations.at(type)->index; - this->frames = animations.at(type)->frames; - this->speed = animations.at(type)->speed; + this->animationIndex = animations->at(type)->index; + this->frames = animations->at(type)->frames; + this->speed = animations->at(type)->speed; } -void SpriteComponent::setDirection(Direction direction) +void SpriteComponent::setDirection(Direction direction) { this->flipped = direction == Direction::RIGHT; } \ No newline at end of file diff --git a/src/StatEffectsComponent.cpp b/src/StatEffectsComponent.cpp index e113462..c66e206 100644 --- a/src/StatEffectsComponent.cpp +++ b/src/StatEffectsComponent.cpp @@ -15,15 +15,15 @@ void StatEffectsComponent::update() if (this->buffs.at(i) == 0) continue; if (this->buffs.at(i) - 1 == 0) { - this->modifyStatValue((Stats)i, BUFF_VALUE * -1); + this->resetStatValue((Stats)i); } this->buffs.at(i) -= 1; } } -void StatEffectsComponent::modifyStatDur(Stats stat, int duration) +void StatEffectsComponent::modifyStatDur(Stats stat, int duration, int value) { - if(this->buffs.at((uint8_t)stat) == 0) this->modifyStatValue(stat, BUFF_VALUE); + if(this->buffs.at((uint8_t)stat) == 0) this->modifyStatValue(stat, value); this->buffs.at((uint8_t)stat) += duration; } @@ -39,4 +39,18 @@ void StatEffectsComponent::modifyStatValue(Stats stat, int modifier) //modifier break; default: break; } +} + +void StatEffectsComponent::resetStatValue(Stats stat) +{ + switch (stat) + { + case Stats::MOVEMENT_SPEED: + this->entity->getComponent().resetSpeedMod(); + break; + case Stats::ATTACK_SPEED: + // this->entity->getComponent().resetAtkSpeedMod(); + break; + default: break; + } } \ No newline at end of file diff --git a/src/TransformComponent.cpp b/src/TransformComponent.cpp index 71b1302..07db8f3 100644 --- a/src/TransformComponent.cpp +++ b/src/TransformComponent.cpp @@ -56,8 +56,8 @@ void TransformComponent::update() float multiplier = direction.x != 0 && direction.y != 0 ? 0.707 : 1; // normalizes vector; only works if directions are in increments of 45° Vector2D positionChange( - direction.x * speed * multiplier, - direction.y * speed * multiplier + direction.x * this->getSpeed() * multiplier, + direction.y * this->getSpeed() * multiplier ); if (this->entity->hasGroup((size_t)Entity::GroupLabel::PLAYERS)){ @@ -69,7 +69,7 @@ void TransformComponent::update() void TransformComponent::modifySpeed(int8_t modifier) { - this->speed += modifier; + this->speedMod += modifier; } void TransformComponent::setPositionAfterCollision(Vector2D& positionChange) diff --git a/src/main.cpp b/src/main.cpp index 092afb4..3546600 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,7 +21,7 @@ int main(int argc, char* argv[]) game = new GameInternal(); game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false); - while (game->running()) { + while (game->isRunning()) { frameStart = SDL_GetTicks(); game->handleEvents();