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

Character selection working

After enter gets pressed on the start screen, a character selection screen gets displayed.
P1 can choose a character via 'a' and 'd' - P2 via 'arrow left' and 'arrow right'.
Selections get locked in upon pressing enter.

Code is currently working, but in need of improvements.
This commit is contained in:
ezveee 2024-01-28 10:14:10 +01:00
parent fa480f916f
commit a9ae4f087e
4 changed files with 110 additions and 5 deletions

1
extern/libpng vendored Submodule

@ -0,0 +1 @@
Subproject commit 71b9b5e16ef751d973a3935284382bc344ff9941

1
extern/zlib vendored Submodule

@ -0,0 +1 @@
Subproject commit 09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851

View File

@ -14,6 +14,7 @@ public:
~Game();
void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
void selectCharacters(const char* &playerSprite, const char* &enemySprite);
void handleEvents();
void update();

View File

@ -61,7 +61,7 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
SDL_RenderCopy(renderer, backgroundTexture, NULL, NULL);
SDL_RenderPresent(renderer);
SDL_Event event;
//SDL_Event event;
bool hasQuit = false;
while (!hasQuit)
@ -96,7 +96,12 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
return;
}
this->isRunning = true;
// character selection
const char* playerSprite;
const char* enemySprite;
selectCharacters(playerSprite, enemySprite);
if (this->isRunning == false) return;
map = new Map();
map->loadMap("assets/SDL_map_test.txt", 25, 20);
@ -111,14 +116,14 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
//ecs implementation
player.addComponent<TransformComponent>(80,80,2); //posx, posy, scale
player.addComponent<SpriteComponent>("assets/chicken_knight_spritesheet.png", true); //adds sprite (32x32px), path needed
player.addComponent<SpriteComponent>(playerSprite, true); //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<ColliderComponent>("player", 0.8f); //adds tag (for further use, reference tag)
player.addComponent<HealthComponent>(5, &manager, true);
player.addGroup((size_t)GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order
enemy.addComponent<TransformComponent>(600, 500, 2);
enemy.addComponent<SpriteComponent>("assets/chicken_spritesheet.png", true);
enemy.addComponent<SpriteComponent>(enemySprite, true);
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", 0.8f);
enemy.addComponent<HealthComponent>(5, &manager, false);
@ -126,6 +131,103 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo
}
void Game::selectCharacters(const char* &playerSprite, const char* &enemySprite)
{
constexpr int CHARACTER_COUNT = 3;
// TODO: move this whereever it makes sense (maybe game as a member)
std::map<int, std::pair<const char*, const char*>> characterSprites;
characterSprites[0] = std::make_pair("assets/chicken_neutral_knight.png", "assets/chicken_knight_spritesheet.png");
characterSprites[1] = std::make_pair("assets/chicken_neutral.png", "assets/chicken_spritesheet.png");
characterSprites[2] = std::make_pair("assets/chicken_neutral_knight.png", "assets/chicken_knight_spritesheet.png");
SDL_Rect playerCharacterRects[CHARACTER_COUNT];
SDL_Rect enemyCharacterRects[CHARACTER_COUNT];
SDL_Texture* characterTextures[CHARACTER_COUNT];
int playerSelection = 0;
int enemySelection = 0;
// load textures
for (int i = 0; i < CHARACTER_COUNT; ++i)
{
characterTextures[i] = IMG_LoadTexture(renderer, characterSprites.find(i)->second.first);
}
// set up initial positions for character rects
for (int i = 0; i < CHARACTER_COUNT; ++i)
{
playerCharacterRects[i] = { 50 + i * 100, 200, 64, 64 };
enemyCharacterRects[i] = { 450 + i * 100, 200, 64, 64 };
}
bool hasQuit = false;
while (!hasQuit)
{
SDL_PollEvent(&event);
if (event.type == SDL_QUIT)
{
hasQuit = true;
}
if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.scancode == SDL_SCANCODE_RETURN)
{
break;
}
switch (event.key.keysym.scancode)
{
case SDL_SCANCODE_A:
playerSelection = (playerSelection - 1 + CHARACTER_COUNT) % CHARACTER_COUNT;
break;
case SDL_SCANCODE_D:
playerSelection = (playerSelection + 1) % CHARACTER_COUNT;
break;
case SDL_SCANCODE_LEFT:
enemySelection = (enemySelection - 1 + CHARACTER_COUNT) % CHARACTER_COUNT;
break;
case SDL_SCANCODE_RIGHT:
enemySelection = (enemySelection + 1) % CHARACTER_COUNT;
break;
default:
break;
}
}
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
for (int i = 0; i < CHARACTER_COUNT; ++i)
{
SDL_RenderCopy(renderer, characterTextures[i], nullptr, &playerCharacterRects[i]);
SDL_RenderCopy(renderer, characterTextures[i], nullptr, &enemyCharacterRects[i]);
}
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderDrawRect(renderer, &playerCharacterRects[playerSelection]);
SDL_RenderDrawRect(renderer, &enemyCharacterRects[enemySelection]);
SDL_RenderPresent(renderer);
}
if (hasQuit)
{
this->isRunning = false;
return;
}
playerSprite = characterSprites.find(playerSelection)->second.second;
enemySprite = characterSprites.find(enemySelection)->second.second;
this->isRunning = true;
}
auto& tiles(manager.getGroup((size_t)GroupLabel::MAP));
auto& players(manager.getGroup((size_t)GroupLabel::PLAYERS));
auto& enemies(manager.getGroup((size_t)GroupLabel::ENEMIES));
@ -261,4 +363,4 @@ bool Game::running() const
bool Game::getWinner() {
return this->winner;
}
}