0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 15:53:42 +00:00

ref(Animations, ECS impl):

dehardcoded Animations and moved ECS implementation + moved select screen function to chickengame
This commit is contained in:
Nimac0 2024-05-20 21:05:20 +02:00
parent 1f27d24de3
commit 31d7f42a31
9 changed files with 70 additions and 65 deletions

View File

@ -16,11 +16,5 @@ struct Animation
} }
}; };
enum AnimationType //TODO enum class
{
IDLE = 0,
WALK = 1
};

View File

@ -38,7 +38,8 @@ public:
void update(); void update();
void render(); void render();
void clean(); void clean();
bool running() const; bool isRunning() const;
void setRunning(bool running);
/* static */ SDL_Renderer* renderer = nullptr; /* static */ SDL_Renderer* renderer = nullptr;
/* static */ SDL_Event event; /* static */ SDL_Event event;
@ -51,10 +52,8 @@ public:
Manager manager; Manager manager;
Map* map; // game specific, might not be needed for all types of games Map* map; // game specific, might not be needed for all types of games
Entity& player1; //Entity& player1;
Entity& player2; //Entity& player2;
Entity& wall;
std::vector<Entity*>& tiles; std::vector<Entity*>& tiles;
std::vector<Entity*>& players; std::vector<Entity*>& players;
@ -70,7 +69,7 @@ public:
private: private:
int counter = 0; int counter = 0;
bool isRunning = false; bool running = false;
SDL_Window* window; SDL_Window* window;
Entity::TeamLabel winner; Entity::TeamLabel winner;
}; };

View File

@ -3,6 +3,7 @@
#include <map> #include <map>
#include <SDL_render.h> #include <SDL_render.h>
#include <memory> #include <memory>
#include <string>
#include "AnimationHandler.h" #include "AnimationHandler.h"
#include "Component.h" #include "Component.h"
@ -15,7 +16,7 @@ class SpriteComponent : public Component
public: public:
int animationIndex = 0; int animationIndex = 0;
std::map<AnimationType, std::unique_ptr<Animation>> animations; std::map<std::string, std::unique_ptr<Animation>>* animations = nullptr;
private: private:
TransformComponent* transform; TransformComponent* transform;
@ -32,7 +33,11 @@ private:
public: public:
SpriteComponent() = default; SpriteComponent() = default;
SpriteComponent(const char* path); SpriteComponent(const char* path);
SpriteComponent(const char* path, bool isAnimated); SpriteComponent(
const char* path,
bool isAnimated,
std::map<std::string, std::unique_ptr<Animation>>* animationList,
std::string defaultAnimation);
~SpriteComponent(); ~SpriteComponent();
void setTexture(const char* path); void setTexture(const char* path);
@ -40,6 +45,6 @@ public:
void init() override; void init() override;
void update() override; void update() override;
void draw() override; void draw() override;
void playAnimation(AnimationType type); void playAnimation(std::string type);
void setDirection(Direction direction); void setDirection(Direction direction);
}; };

View File

@ -21,10 +21,9 @@ Game::Game() :
players(manager.getGroup((size_t)Entity::GroupLabel::PLAYERS)), players(manager.getGroup((size_t)Entity::GroupLabel::PLAYERS)),
projectiles(manager.getGroup((size_t)Entity::GroupLabel::PROJECTILE)), projectiles(manager.getGroup((size_t)Entity::GroupLabel::PROJECTILE)),
hearts(manager.getGroup((size_t)Entity::GroupLabel::HEARTS)), hearts(manager.getGroup((size_t)Entity::GroupLabel::HEARTS)),
powerups(manager.getGroup((size_t)Entity::GroupLabel::POWERUPS)), powerups(manager.getGroup((size_t)Entity::GroupLabel::POWERUPS))
player1(manager.addEntity()), //player1(manager.addEntity()),
player2(manager.addEntity()), //player2(manager.addEntity())
wall(manager.addEntity())
{ {
engine::game = this; engine::game = this;
}; };
@ -129,7 +128,7 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
if (hasQuit) if (hasQuit)
{ {
this->isRunning = false; this->setRunning(false);
return; return;
} }
@ -140,7 +139,7 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
const char* player2Sprite; const char* player2Sprite;
selectCharacters(player1Sprite, player2Sprite); selectCharacters(player1Sprite, player2Sprite);
if (this->isRunning == false) return; if (this->isRunning() == false) return;
map = new Map(); map = new Map();
@ -158,24 +157,24 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
//ecs implementation //ecs implementation
player1.setTeam(Entity::TeamLabel::BLUE); // player1.setTeam(Entity::TeamLabel::BLUE);
player1.addComponent<TransformComponent>(80,80,2); //posx, posy, scale // player1.addComponent<TransformComponent>(80,80,2); //posx, posy, scale
player1.addComponent<SpriteComponent>(player1Sprite, true); //adds sprite (32x32px), path needed // player1.addComponent<SpriteComponent>(player1Sprite, true); //adds sprite (32x32px), path needed
player1.addComponent<KeyboardController>(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<KeyboardController>(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<ColliderComponent>("player", 0.8f); //adds tag (for further use, reference tag) // player1.addComponent<ColliderComponent>("player", 0.8f); //adds tag (for further use, reference tag)
player1.addComponent<HealthComponent>(5, Direction::LEFT, "assets/heart.png"); // player1.addComponent<HealthComponent>(5, Direction::LEFT, "assets/heart.png");
player1.addComponent<StatEffectsComponent>(); // player1.addComponent<StatEffectsComponent>();
player1.addGroup((size_t) Entity::GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order // player1.addGroup((size_t) Entity::GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order
player2.setTeam(Entity::TeamLabel::RED); // player2.setTeam(Entity::TeamLabel::RED);
player2.addComponent<TransformComponent>(600, 500, 2); // player2.addComponent<TransformComponent>(600, 500, 2);
player2.addComponent<SpriteComponent>(player2Sprite, true); // player2.addComponent<SpriteComponent>(player2Sprite, true);
player2.addComponent<KeyboardController>(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-2, 0)); // player2.addComponent<KeyboardController>(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-2, 0));
player2.addComponent<ColliderComponent>("enemy", 0.8f); // player2.addComponent<ColliderComponent>("enemy", 0.8f);
player2.addComponent<HealthComponent>(5, Direction::RIGHT, "assets/heart.png"); // player2.addComponent<HealthComponent>(5, Direction::RIGHT, "assets/heart.png");
player2.addComponent<StatEffectsComponent>(); // player2.addComponent<StatEffectsComponent>();
player2.addGroup((size_t) Entity::GroupLabel::PLAYERS); // player2.addGroup((size_t) Entity::GroupLabel::PLAYERS);
} }
void Game::selectCharacters(const char* &playerSprite, const char* &enemySprite) void Game::selectCharacters(const char* &playerSprite, const char* &enemySprite)
@ -265,13 +264,13 @@ void Game::selectCharacters(const char* &playerSprite, const char* &enemySprite)
if (hasQuit) if (hasQuit)
{ {
this->isRunning = false; this->setRunning(false);
return; return;
} }
playerSprite = characterSprites.find(playerSelection)->second.second; playerSprite = characterSprites.find(playerSelection)->second.second;
enemySprite = characterSprites.find(enemySelection)->second.second; enemySprite = characterSprites.find(enemySelection)->second.second;
this->isRunning = true; this->setRunning(true);
} }
void Game::handleEvents() void Game::handleEvents()
@ -280,7 +279,7 @@ void Game::handleEvents()
switch (event.type) switch (event.type)
{ {
case SDL_QUIT: this->isRunning = false; case SDL_QUIT: this->setRunning(false);
break; break;
default: default:
@ -326,15 +325,20 @@ void Game::clean()
std::cout << "Game Cleaned!" << std::endl; std::cout << "Game Cleaned!" << std::endl;
} }
bool Game::running() const bool Game::isRunning() const
{ {
return isRunning; return running;
}
void Game::setRunning(bool running)
{
this->running = running;
} }
void Game::setWinner(Entity::TeamLabel winningTeam) void Game::setWinner(Entity::TeamLabel winningTeam)
{ {
this->winner = winningTeam; this->winner = winningTeam;
this->isRunning = false; this->setRunning(false);
} }
Entity::TeamLabel Game::getWinner() const Entity::TeamLabel Game::getWinner() const

View File

@ -25,27 +25,27 @@ void KeyboardController::update()
{ {
transform->direction.x = 0; transform->direction.x = 0;
transform->direction.y = 0; transform->direction.y = 0;
sprite->playAnimation(IDLE); sprite->playAnimation("IDLE");
if (keystates[this->up]) { if (keystates[this->up]) {
transform->direction.y = -1; transform->direction.y = -1;
sprite->playAnimation(WALK); sprite->playAnimation("WALK");
SoundManager::playSound(this->entity->getManager().getGame(), STEPS); SoundManager::playSound(this->entity->getManager().getGame(), STEPS);
} }
if (keystates[this->left]) { if (keystates[this->left]) {
transform->direction.x = -1; transform->direction.x = -1;
sprite->playAnimation(WALK); sprite->playAnimation("WALK");
sprite->setDirection(Direction::LEFT); sprite->setDirection(Direction::LEFT);
SoundManager::playSound(this->entity->getManager().getGame(), STEPS); SoundManager::playSound(this->entity->getManager().getGame(), STEPS);
} }
if (keystates[this->down]) { if (keystates[this->down]) {
transform->direction.y = 1; transform->direction.y = 1;
sprite->playAnimation(WALK); sprite->playAnimation("WALK");
SoundManager::playSound(this->entity->getManager().getGame(), STEPS); SoundManager::playSound(this->entity->getManager().getGame(), STEPS);
} }
if (keystates[this->right]) { if (keystates[this->right]) {
transform->direction.x = 1; transform->direction.x = 1;
sprite->playAnimation(WALK); sprite->playAnimation("WALK");
sprite->setDirection(Direction::RIGHT); sprite->setDirection(Direction::RIGHT);
SoundManager::playSound(this->entity->getManager().getGame(), STEPS); SoundManager::playSound(this->entity->getManager().getGame(), STEPS);
} }

View File

@ -17,14 +17,17 @@ SpriteComponent::SpriteComponent(const char* path)
this->texturePath = path; this->texturePath = path;
} }
SpriteComponent::SpriteComponent(const char* path, bool isAnimated) SpriteComponent::SpriteComponent(
const char* path,
bool isAnimated,
std::map<std::string, std::unique_ptr<Animation>>* animationMap,
std::string defaultAnimation)
{ {
animated = isAnimated; animated = isAnimated;
animations.emplace(IDLE, std::make_unique<Animation>((uint8_t)AnimationType::IDLE, 2, 200)); animations = animationMap;
animations.emplace(WALK, std::make_unique<Animation>((uint8_t)AnimationType::WALK, 2, 200));
playAnimation(IDLE); playAnimation(defaultAnimation);
this->texturePath = path; this->texturePath = path;
} }
@ -71,11 +74,11 @@ void SpriteComponent::draw()
this->entity->getManager().getGame()->textureManager->draw(this->entity->getManager().getGame()->renderer, this->texture, this->srcRect, this->destRect, this->animated && this->flipped); 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->animationIndex = animations->at(type)->index;
this->frames = animations.at(type)->frames; this->frames = animations->at(type)->frames;
this->speed = animations.at(type)->speed; this->speed = animations->at(type)->speed;
} }
void SpriteComponent::setDirection(Direction direction) void SpriteComponent::setDirection(Direction direction)

View File

@ -21,7 +21,7 @@ int main(int argc, char* argv[])
game = new Game(); game = new Game();
game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false); 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(); frameStart = SDL_GetTicks();
game->handleEvents(); game->handleEvents();