diff --git a/assets/fonts/CompassPro.ttf b/assets/fonts/CompassPro.ttf new file mode 100644 index 0000000..5432d65 Binary files /dev/null and b/assets/fonts/CompassPro.ttf differ diff --git a/game/game_state.h b/game/game_state.h index 8e65de2..c16364d 100644 --- a/game/game_state.h +++ b/game/game_state.h @@ -17,6 +17,9 @@ typedef struct Game { BzTileMap map; BzSpatialGrid *entityGrid; f32 frameDuration; + + Font font; + struct { i64 wood; i64 iron; diff --git a/game/main.c b/game/main.c index d23ff64..3990eee 100644 --- a/game/main.c +++ b/game/main.c @@ -152,6 +152,7 @@ bool init(void *userData) { ecs_singleton_set(ECS, Game, {}); Game *game = ecs_singleton_get_mut(ECS, Game); game->screen = 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