feature: hud (#37)

* build: replace FetchContent with direct includes for glm

* build(deps): replace SOIL2 with stb for image and vorbis decoding

* build: replace FetchContent with direct includes for toml++

* refactor(texture): bump block texture size to 512 and disable items tab

* feat: add hotbar system with ItemStack and RowLayout

* fix(ui): restrict Ctrl key handling to typing mode

* feat(ui): add widget border support and highlight selected hotbar slot

* fix(ui): update borders on scale change and correct Image width

- Added update_border() calls in set_scale() for Button, ChatBox, Image, Label, and TextField.
- Fixed Image::width() to multiply by width instead of height.
- Added early return in Widget::update_border() if border is not supported.

* feat(ui): add border visual feedback on slider drag

* feat(ui): add ItemSlot widget and refactor hotbar to use it

* feat(world_scene): add inventory UI and pause type enum

* feat(ui): add item slot tooltip and make window size static

* fix(ui label): account for background offset in width/height

* refactor(ui): centralize item info label in inventory and add update

* feat(ui): add hotbar interaction in inventory UI

* fix(inventory-ui): correct row creation logic for first item

The loop starting at index 0 created a new row on the first iteration
(i % 10 == 0). Shift the loop to start at 1 and adjust modulus condition
to create rows correctly every 10 items.

* feat(block): add name_key for localized block names

Add `name_key` field to all block TOML definitions, enabling per-block localization. Update `BlockData` struct and `BlockManager` with `local_name()` method that returns a localized string via the translation system. Add corresponding entries to `en_US.json` and `zh_CN.json`. Modify inventory UI to use the localized name when displaying block info, and fix a bug where emptying a hotbar slot did not clear the item locally.

* fix(ui): change inventory item slot color from white to gray

* fix(ui): add missing include for std::array
This commit is contained in:
zhenyan121
2026-07-23 14:07:11 +08:00
committed by GitHub
parent 45d2c8234a
commit def311c7dd
565 changed files with 98955 additions and 214 deletions

View File

@@ -8,8 +8,8 @@ WorldScene::WorldScene(SceneManager& scene_manager)
: m_scene_manager(scene_manager), m_dev_panel(*this),
m_client_world(scene_manager.app().audio(), scene_manager.app().config(),
*this),
m_pasue_menu(*this), m_hud_ui(*this), m_error_ui(*this),
m_argument(scene_manager.app().argument()) {}
m_pasue_menu(*this), m_inventory_ui(*this), m_hud_ui(*this),
m_error_ui(*this), m_argument(scene_manager.app().argument()) {}
WorldScene::~WorldScene() {
if (m_client) {
@@ -46,7 +46,14 @@ void WorldScene::update(float dt) {
}
}*/
if (m_paused) {
m_pasue_menu.update(dt);
switch (m_paused_ui) {
case PauseUI::INVENTORY:
m_inventory_ui.update(dt);
break;
case PauseUI::PAUSE_MENU:
m_pasue_menu.update(dt);
break;
}
} else {
m_hud_ui.update(dt);
}
@@ -62,7 +69,14 @@ void WorldScene::render(Renderer& renderer) {
m_hud_ui.render(renderer);
}
if (m_paused) {
m_pasue_menu.render(renderer);
switch (m_paused_ui) {
case PauseUI::INVENTORY:
m_inventory_ui.render(renderer);
break;
case PauseUI::PAUSE_MENU:
m_pasue_menu.render(renderer);
break;
}
} else {
if (m_show_dev_pannel && m_show_hud) {
renderer.render_dev_panel(m_dev_panel);
@@ -139,6 +153,7 @@ void WorldScene::on_enter() {
m_dev_panel.init();
m_pasue_menu.init();
m_hud_ui.init();
m_inventory_ui.init();
m_scene_manager.app().audio().set_client(m_client);
m_scene_manager.app().window().set_game_running(true);
} catch (const std::exception& e) {
@@ -191,8 +206,11 @@ bool WorldScene::handle_mouse_move_event(const MouseMoveEvent& e) {
return true;
}
if (m_paused) {
if (m_pasue_menu.handle_event(e)) {
return true;
switch (m_paused_ui) {
case PauseUI::INVENTORY:
return m_inventory_ui.handle_event(e);
case PauseUI::PAUSE_MENU:
return m_pasue_menu.handle_event(e);
}
} else {
if (m_hud_ui.handle_event(e)) {
@@ -217,8 +235,11 @@ bool WorldScene::handle_mouse_button_event(const MouseButtonEvent& e) {
return true;
}
if (m_paused) {
if (m_pasue_menu.handle_event(e)) {
return true;
switch (m_paused_ui) {
case PauseUI::INVENTORY:
return m_inventory_ui.handle_event(e);
case PauseUI::PAUSE_MENU:
return m_pasue_menu.handle_event(e);
}
} else {
if (m_hud_ui.handle_event(e)) {
@@ -257,8 +278,11 @@ bool WorldScene::handle_mouse_wheel_event(const MouseWheelEvent& e) {
return true;
}
if (m_paused) {
if (m_pasue_menu.handle_event(e)) {
return true;
switch (m_paused_ui) {
case PauseUI::INVENTORY:
return m_inventory_ui.handle_event(e);
case PauseUI::PAUSE_MENU:
return m_pasue_menu.handle_event(e);
}
} else {
if (m_hud_ui.handle_event(e)) {
@@ -286,6 +310,14 @@ bool WorldScene::handle_key_event(const KeyEvent& e) {
}
bool pasued = pause();
pasued = !pasued;
m_paused_ui = PauseUI::PAUSE_MENU;
set_pause(pasued);
return true;
}
if (e.key == Key::E && e.action == KeyAction::PRESS) {
bool pasued = pause();
pasued = !pasued;
m_paused_ui = PauseUI::INVENTORY;
set_pause(pasued);
return true;
}
@@ -327,8 +359,11 @@ bool WorldScene::handle_key_event(const KeyEvent& e) {
}
if (m_paused) {
if (m_pasue_menu.handle_event(e)) {
return true;
switch (m_paused_ui) {
case PauseUI::INVENTORY:
return m_inventory_ui.handle_event(e);
case PauseUI::PAUSE_MENU:
return m_pasue_menu.handle_event(e);
}
} else {
if (m_hud_ui.handle_event(e)) {
@@ -353,7 +388,12 @@ bool WorldScene::handle_text_input_event(const TextInputEvent& e) {
return m_error_ui.handle_event(e);
}
if (m_paused) {
return m_pasue_menu.handle_text_input_event(e);
switch (m_paused_ui) {
case PauseUI::INVENTORY:
return m_inventory_ui.handle_event(e);
case PauseUI::PAUSE_MENU:
return m_pasue_menu.handle_event(e);
}
}
return m_hud_ui.handle_text_input_event(e);