diff --git a/assets/characterSelection.png b/assets/characterSelection.png new file mode 100644 index 0000000..d88de55 Binary files /dev/null and b/assets/characterSelection.png differ diff --git a/assets/chicken_mlady_spritesheet.png b/assets/chicken_mlady_spritesheet.png new file mode 100644 index 0000000..c075990 Binary files /dev/null and b/assets/chicken_mlady_spritesheet.png differ diff --git a/assets/chicken_neutral_mlady.png b/assets/chicken_neutral_mlady.png new file mode 100644 index 0000000..3973d7d Binary files /dev/null and b/assets/chicken_neutral_mlady.png differ diff --git a/assets/chicken_neutral_wizard.png b/assets/chicken_neutral_wizard.png new file mode 100644 index 0000000..aba3980 Binary files /dev/null and b/assets/chicken_neutral_wizard.png differ diff --git a/assets/chicken_wizard_spritesheet.png b/assets/chicken_wizard_spritesheet.png new file mode 100644 index 0000000..8694c93 Binary files /dev/null and b/assets/chicken_wizard_spritesheet.png differ diff --git a/extern/libpng b/extern/libpng new file mode 160000 index 0000000..71b9b5e --- /dev/null +++ b/extern/libpng @@ -0,0 +1 @@ +Subproject commit 71b9b5e16ef751d973a3935284382bc344ff9941 diff --git a/extern/zlib b/extern/zlib new file mode 160000 index 0000000..09155ea --- /dev/null +++ b/extern/zlib @@ -0,0 +1 @@ +Subproject commit 09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851 diff --git a/include/Constants.h b/include/Constants.h index 502bd2b..f5e691c 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -4,6 +4,8 @@ using Group = std::size_t; +constexpr int CHARACTER_COUNT = 4; + constexpr std::size_t MAX_COMPONENTS = 32; constexpr std::size_t MAX_GROUPS = 32; @@ -16,4 +18,3 @@ constexpr int TILE_SIZE = 32; constexpr int MAP_SIZE_X = 25; constexpr int MAP_SIZE_Y = 20; - diff --git a/include/Game.h b/include/Game.h index ed07f38..1a40716 100644 --- a/include/Game.h +++ b/include/Game.h @@ -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(); diff --git a/src/Game.cpp b/src/Game.cpp index a979a8b..21f0d35 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -5,6 +5,7 @@ #include "AssetManager.h" #include "Map.h" #include "TextureManager.h" +#include "Constants.h" Map* map; Manager manager; @@ -61,7 +62,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 +97,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 +117,14 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo //ecs implementation player.addComponent(80,80,2); //posx, posy, scale - player.addComponent("assets/chicken_knight_spritesheet.png", true); //adds sprite (32x32px), path needed + player.addComponent(playerSprite, true); //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", 0.8f); //adds tag (for further use, reference tag) player.addComponent(5, &manager, true); player.addGroup((size_t)GroupLabel::PLAYERS); //tell programm what group it belongs to for rendering order enemy.addComponent(600, 500, 2); - enemy.addComponent("assets/chicken_spritesheet.png", true); + enemy.addComponent(enemySprite, true); enemy.addComponent(SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_RCTRL, Vector2D(-1, 0)); enemy.addComponent("enemy", 0.8f); enemy.addComponent(5, &manager, false); @@ -126,6 +132,102 @@ void Game::init(const char* title, int xpos, int ypos, int width, int height, bo } +void Game::selectCharacters(const char* &playerSprite, const char* &enemySprite) +{ + // TODO: move this whereever it makes sense (maybe game as a member) + std::map> 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_wizard.png", "assets/chicken_wizard_spritesheet.png"); + characterSprites[3] = std::make_pair("assets/chicken_neutral_mlady.png", "assets/chicken_mlady_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] = { 134 + (i % 2) * 118, 272 + ((i >= 2) ? 114 : 0), 64, 64 }; + enemyCharacterRects[i] = { 485 + (i % 2) * 118, 273 + ((i >= 2) ? 114 : 0), 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_Texture* backgroundTexture = TextureManager::get().loadTexture("assets/characterSelection.png"); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, backgroundTexture, NULL, NULL); + + 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; -} \ No newline at end of file +}