From 118f7f9d93ebc3f5772c67276d203a630c8aff36 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Thu, 28 Dec 2023 09:47:55 +0100 Subject: [PATCH] Add top bar game UI --- assets/game.png | Bin 375312 -> 376450 bytes game/game_tileset.h | 11 +++++++++ game/main.c | 47 ++++++++++++++++++++++++++++++++++--- game/ui_widgets.c | 41 ++++++++++++++++++++++++++++++-- game/ui_widgets.h | 4 +++- scripts/extract_tileset.py | 2 ++ 6 files changed, 99 insertions(+), 6 deletions(-) diff --git a/assets/game.png b/assets/game.png index 3d2c7d0ec1420ab4c1e3e5dd6c975ccc05d0d57d..5bb605ebe0114d83e51cb2034755e808d3d940de 100644 GIT binary patch delta 12137 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 delta 10846 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 @@ -300,13 +306,48 @@ static void renderGame(Game *game, float dt) { EndMode2D(); -} -static void drawOverScreen(Color c) { + // 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 + }); + // 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 + }); + Color topBarBG = {0, 0, 0, 50}; + bzUISetBackgroundStyle(UI, topBar, (BzUIBackgroundStyle) { + .normal = topBarBG, + .hover = topBarBG, + .active = topBarBG, + }); + BzTileset *tileset = &game->tileset; + Rectangle woodRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_WOOD)); + Rectangle stoneRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_STONE)); + Rectangle goldRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_GOLD)); + Rectangle popRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_POP)); + uiGameResCount(100, -1, woodRec, tileset->tiles); + uiGameResCount(100, -1, stoneRec, tileset->tiles); + uiGameResCount(100, -1, goldRec, tileset->tiles); + uiGameResCount(25, 100, popRec, tileset->tiles); + bzUIPopParent(UI); + + + bzUIEnd(UI); - DrawRectangle(0, 0, width, height, c); } + static void renderMainMenu(Game *game, float dt) { i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); diff --git a/game/ui_widgets.c b/game/ui_widgets.c index a054edf..753c929 100644 --- a/game/ui_widgets.c +++ b/game/ui_widgets.c @@ -16,8 +16,8 @@ Font getFont() { return game->font; } -void uiPushDivParentPercentage(f32 xPercent, f32 yPercent) { - bzUIPushDiv(UI, (BzUISize) { +BzUINode *uiPushDivParentPercentage(f32 xPercent, f32 yPercent) { + return bzUIPushDiv(UI, (BzUISize) { .kind = BZ_UI_SIZE_REL_PARENT, .value = xPercent, }, (BzUISize) { @@ -201,3 +201,40 @@ void uiSettingsCheckbox(const char *txt, bool *check) { void uiSettingsSlider(const char *txt, f32 *value) { uiBaseSlider(txt, getFont(), 1.0f, value, 0, 10); } + +void uiGameResCount(i32 amount, i32 capacity, Rectangle icon, Texture2D texture) { + bzUIPushDiv(UI, (BzUISize) { BZ_UI_SIZE_CHILD_SUM }, + (BzUISize) { BZ_UI_SIZE_CHILD_MAX }); + bzUISetParentLayout(UI, (BzUILayout) { + BZ_UI_LAYOUT_FLEX_BOX, + BZ_UI_FLEX_DIR_ROW | BZ_UI_FLEX_ALIGN_CENTER + }); + char buf[64]; + BzUIKey id = bzUIGetUniqueKey(UI); + if (capacity == -1) + snprintf(buf, sizeof(buf), "%d##%d", amount, id); + else + snprintf(buf, sizeof(buf), "%d/%d##%d", amount, capacity, id); + const f32 scl = 0.4f; + uiBaseLabel(buf, getFont(), scl); + + BzUINode *iconNode = bzUINodeMake(UI, id, &(BzUINodeDesc) { + .flags = BZ_UI_DRAW_SPRITE | BZ_UI_ALIGN_CENTER, + .semanticSize[BZ_UI_AXIS_X] = { + BZ_UI_SIZE_PIXELS, 80 * scl * uiGetScale(), + }, + .semanticSize[BZ_UI_AXIS_Y] = { + BZ_UI_SIZE_PIXELS, 80 * scl * uiGetScale(), + }, + .margin = {0, 0, 20 * uiGetScale(), 0} + }); + bzUISetSpriteStyle(UI, iconNode, (BzUISpriteStyle) { + .rec = icon, + .texture = texture, + .tintNormal = WHITE, + .tintHover = WHITE, + .tintActive = WHITE, + }); + + bzUIPopParent(UI); +} diff --git a/game/ui_widgets.h b/game/ui_widgets.h index 7d03e06..bd4e6f0 100644 --- a/game/ui_widgets.h +++ b/game/ui_widgets.h @@ -8,7 +8,7 @@ extern BzUI *UI; // defined in main.c f32 uiGetScale(); -void uiPushDivParentPercentage(f32 xPercent, f32 yPercent); +BzUINode *uiPushDivParentPercentage(f32 xPercent, f32 yPercent); // Template stuff void uiBaseLabel(const char *txt, Font font, f32 scl); @@ -25,4 +25,6 @@ bool uiSettingsButton(const char *txt); void uiSettingsCheckbox(const char *txt, bool *check); void uiSettingsSlider(const char *txt, f32 *value); +void uiGameResCount(i32 amount, i32 capacity, Rectangle icon, Texture2D texture); + #endif //PIXELDEFENSE_UI_WIDGETS_H diff --git a/scripts/extract_tileset.py b/scripts/extract_tileset.py index c19cd4a..93c4c9d 100644 --- a/scripts/extract_tileset.py +++ b/scripts/extract_tileset.py @@ -72,6 +72,8 @@ anim_writer = AnimationWriter(writer, "entity", "anim", entity_tiles) anim_writer.output_enum() anim_writer.output_anim_enum() + +anim_writer.output_enum_to_tile("getEntityTile") anim_writer.output_has_anim("entityHasAnimation") anim_writer.output_anim_sequence("entityGetAnimationSequence") anim_writer.output_anim_frame("entityGetAnimationFrame")