From ea93a7aa33f0da2b29a64ebda6ad309faac5ce7e Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Fri, 22 Dec 2023 08:38:56 +0100 Subject: [PATCH] Add Main menu screen --- assets/fonts/CompassPro.ttf | Bin 0 -> 19836 bytes game/game_state.h | 3 ++ game/main.c | 11 ++++-- game/ui_widgets.c | 71 +++++++++++++++++++++++++++++++----- game/ui_widgets.h | 10 ++++- 5 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 assets/fonts/CompassPro.ttf diff --git a/assets/fonts/CompassPro.ttf b/assets/fonts/CompassPro.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5432d659a3b4780312ef81d6191c2bb6ea712a20 GIT binary patch literal 19836 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 nfv3Mhscreen = SCREEN_MAIN_MENU; + game->font = LoadFontEx("assets/fonts/CompassPro.ttf", 92, NULL, 0); ECS_COMPONENT_DEFINE(ECS, InputState); ecs_singleton_set(ECS, InputState, {}); @@ -248,6 +249,8 @@ void deinit(void *userData) { bzUIDestroy(UI); UI = NULL; + + UnloadFont(game->font); } @@ -319,7 +322,7 @@ static void renderMainMenu(Game *game, float dt) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); - uiLargeLabel("PixelDefense"); + uiMainMenuLabel("Pixel Defense"); bzUIPopParent(UI); uiPushDivParentPercentage(1.0f, 0.6f); @@ -327,14 +330,14 @@ 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 (uiLargeTextButton("Play")) { + if (uiMainMenuButton("Play")) { bzLogInfo("Play"); game->screen = SCREEN_GAME; } - if (uiLargeTextButton("Settings")) { + if (uiMainMenuButton("Settings")) { bzLogInfo("Settings"); } - if (uiLargeTextButton("Exit")) { + if (uiMainMenuButton("Exit")) { bzLogInfo("Bye"); bzGameExit(); } diff --git a/game/ui_widgets.c b/game/ui_widgets.c index c53b87d..36d54bd 100644 --- a/game/ui_widgets.c +++ b/game/ui_widgets.c @@ -1,5 +1,19 @@ #include "ui_widgets.h" +#include "game_state.h" + +f32 uiGetScale() { + return GetScreenHeight() / 720.0f; +} + +Font getFont() { + static const Game *game = NULL; + if (!game) { + game = ecs_singleton_get(ECS, Game); + } + return game->font; +} + void uiPushDivParentPercentage(f32 xPercent, f32 yPercent) { bzUIPushDiv(UI, (BzUISize) { .kind = BZ_UI_SIZE_PARENT_PERCENT, @@ -10,10 +24,10 @@ void uiPushDivParentPercentage(f32 xPercent, f32 yPercent) { }); } -void uiLargeLabel(const char *txt) { +void uiBaseLabel(const char *txt, Font font, f32 scl) { bzUINodeMake(UI, bzUIKeyFromString(txt), &(BzUINodeDesc) { - .flags = BZ_UI_DRAW_TEXT | BZ_UI_ALIGN_CENTER, + .flags = BZ_UI_DRAW_TEXT | BZ_UI_DRAW_TEXT_SHADOW | BZ_UI_ALIGN_CENTER, .semanticSize[BZ_UI_AXIS_X] = { .kind = BZ_UI_SIZE_FIT, }, @@ -23,16 +37,55 @@ void uiLargeLabel(const char *txt) { .string = txt, .padding = {5, 5, 5, 5}, .style = { - .font = GetFontDefault(), - .fontSize = 62, - .textColor = BLACK, - .textHoverColor = BLACK, - .textActiveColor = BLACK, + .font = font, + .fontSpacing = 2 * uiGetScale() * scl, + .fontSize = 62 * uiGetScale() * scl, + .shadowOffset[BZ_UI_AXIS_X] = 2 * uiGetScale() * scl, + .shadowOffset[BZ_UI_AXIS_Y] = 2 * uiGetScale() * scl, + .textColor = WHITE, + .textHoverColor = WHITE, + .textActiveColor = WHITE, + .textShadowColor = BLACK, + .textShadowHoverColor = BLACK, + .textShadowActiveColor = BLACK, } }); } -bool uiLargeTextButton(const char *txt) { - return bzUIButton(UI, txt, NULL); +bool uiBaseTextButton(const char *txt, Font font, f32 scl) { + BzUINode *node = bzUINodeMake(UI, bzUIKeyFromString(txt), + &(BzUINodeDesc) { + .flags = BZ_UI_DRAW_TEXT | BZ_UI_DRAW_TEXT_SHADOW | BZ_UI_ALIGN_CENTER, + .semanticSize[BZ_UI_AXIS_X] = { + .kind = BZ_UI_SIZE_FIT, + }, + .semanticSize[BZ_UI_AXIS_Y] = { + .kind = BZ_UI_SIZE_FIT + }, + .string = txt, + .padding = {0, 0, 0, 0}, + .margin = {5, 5, 5, 5}, + .style = { + .font = font, + .fontSpacing = 2 * uiGetScale() * scl, + .fontSize = 62 * uiGetScale() * scl, + .shadowOffset[BZ_UI_AXIS_X] = 2 * uiGetScale() * scl, + .shadowOffset[BZ_UI_AXIS_Y] = 2 * uiGetScale() * scl, + .textColor = WHITE, + .textHoverColor = GRAY, + .textActiveColor = YELLOW, + .textShadowColor = BLACK, + .textShadowHoverColor = BLACK, + .textShadowActiveColor = BLACK, + } + }); + return bzUIGetInteraction(UI, node).clicked; +} + +void uiMainMenuLabel(const char *txt) { + uiBaseLabel(txt, getFont(), 1.8f); +} +bool uiMainMenuButton(const char *txt) { + return uiBaseTextButton(txt, getFont(), 1.0f); } diff --git a/game/ui_widgets.h b/game/ui_widgets.h index 9fe2e73..8fa69ea 100644 --- a/game/ui_widgets.h +++ b/game/ui_widgets.h @@ -6,10 +6,16 @@ extern BzUI *UI; // defined in main.c +f32 uiGetScale(); + void uiPushDivParentPercentage(f32 xPercent, f32 yPercent); -void uiLargeLabel(const char *txt); +// Template stuff +void uiBaseLabel(const char *txt, Font font, f32 scl); +bool uiBaseTextButton(const char *txt, Font font, f32 scl); -bool uiLargeTextButton(const char *txt); +// actual UI +void uiMainMenuLabel(const char *txt); +bool uiMainMenuButton(const char *txt); #endif //PIXELDEFENSE_UI_WIDGETS_H