diff --git a/game/game_state.h b/game/game_state.h index 22d94cd..d91d95d 100644 --- a/game/game_state.h +++ b/game/game_state.h @@ -6,6 +6,7 @@ typedef enum GameScreen { SCREEN_GAME, + SCREEN_PAUSE_MENU, SCREEN_MAIN_MENU, SCREEN_SETTINGS, } GameScreen; diff --git a/game/main.c b/game/main.c index 9ba55ab..93990b2 100644 --- a/game/main.c +++ b/game/main.c @@ -268,6 +268,14 @@ void update(float dt, void *userData) { switch (game->screen) { case SCREEN_GAME: updatePlayerInput(); + if (IsKeyReleased(input->mapping.backBtn)) { + game->screen = SCREEN_PAUSE_MENU; + } + break; + case SCREEN_PAUSE_MENU: + if (IsKeyReleased(input->mapping.backBtn)) { + game->screen = SCREEN_GAME; + } break; case SCREEN_MAIN_MENU: break; @@ -333,32 +341,34 @@ static void renderGame(Game *game, float dt) { drawPlayerInputUI(); EndMode2D(); +} +static void renderGameMenu(Game *game, float dt) { // UI i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); bzUIBegin(UI, width, height); bzUISetParentLayout(UI, (BzUILayout) { - .type = BZ_UI_LAYOUT_FLEX_BOX, - .flags = BZ_UI_FLEX_DIR_COLUMN | - BZ_UI_FLEX_JUSTIFY_SPACE_BETWEEN | - BZ_UI_FLEX_ALIGN_CENTER + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | + BZ_UI_FLEX_JUSTIFY_SPACE_BETWEEN | + BZ_UI_FLEX_ALIGN_CENTER }); // top bar f32 topBarHeight = 0.05f; BzUINode *topBar = uiPushDivParentPercentage(1.0f, topBarHeight); bzUISetParentLayout(UI, (BzUILayout) { - .type = BZ_UI_LAYOUT_FLEX_BOX, - .flags = BZ_UI_FLEX_DIR_ROW | - BZ_UI_FLEX_ALIGN_CENTER | - BZ_UI_FLEX_JUSTIFY_START + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_ROW | + BZ_UI_FLEX_ALIGN_CENTER | + BZ_UI_FLEX_JUSTIFY_START }); Color topBarBG = {0, 0, 0, 50}; bzUISetBackgroundStyle(UI, topBar, (BzUIBackgroundStyle) { - .normal = topBarBG, - .hover = topBarBG, - .active = topBarBG, + .normal = topBarBG, + .hover = topBarBG, + .active = topBarBG, }); BzTileset *tileset = &game->tileset; Rectangle woodRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_WOOD)); @@ -370,12 +380,47 @@ static void renderGame(Game *game, float dt) { uiGameResCount(100, -1, stoneRec, tileset->tiles); uiGameResCount(100, -1, foodRec, tileset->tiles); uiGameResCount(250, -1, goldRec, tileset->tiles); - uiGameResCount(25, 100, popRec, tileset->tiles); + uiGameResCount(1, 10, popRec, tileset->tiles); bzUIPopParent(UI); bzUIEnd(UI); +} +static void renderPauseMenu(Game *game, float dt) { + i32 width = GetScreenWidth(); + i32 height = GetScreenHeight(); + game->camera.zoom = 3 * uiGetScale(); + + bzUIBegin(UI, width, height); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN + }); + + uiPushDivParentPercentage(1.0f, 0.4f); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER + }); + uiMainMenuLabel("Paused"); + bzUIPopParent(UI); + + uiPushDivParentPercentage(1.0f, 0.6f); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER + }); + if (uiMainMenuButton("Resume")) { + game->screen = SCREEN_GAME; + } + if (uiMainMenuButton("Exit")) { + game->screen = SCREEN_MAIN_MENU; + unloadMap(game); + loadMap(game, "assets/maps/main_menu_01.tmj"); + } + bzUIPopParent(UI); + bzUIEnd(UI); } static void renderMainMenu(Game *game, float dt) { @@ -403,7 +448,7 @@ static void renderMainMenu(Game *game, float dt) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER }); - if (uiMainMenuButton("Play") || true) { + if (uiMainMenuButton("Play")) { game->screen = SCREEN_GAME; unloadMap(game); loadMap(game, "assets/maps/map_01.tmj"); @@ -477,16 +522,18 @@ void render(float dt, void *userData) { Game *game = ecs_singleton_get_mut(ECS, Game); const InputState *input = ecs_singleton_get(ECS, InputState);; - if (IsKeyReleased(input->mapping.backBtn)) { - game->screen = SCREEN_MAIN_MENU; - } - Color shadow = BLACK; shadow.a = 35; switch (game->screen) { case SCREEN_GAME: renderGame(game, dt); + renderGameMenu(game, dt); + break; + case SCREEN_PAUSE_MENU: + renderGame(game, dt); + drawOverScreen(shadow); + renderPauseMenu(game, dt); break; case SCREEN_MAIN_MENU: renderGame(game, dt);