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

This commit is contained in:
2026-07-21 17:45:28 +08:00
parent c767a5711f
commit 68f7924f07
6 changed files with 120 additions and 14 deletions

View File

@@ -6,6 +6,7 @@
#include "Cubed/gameplay/network_server.hpp" #include "Cubed/gameplay/network_server.hpp"
#include "Cubed/scene/scene.hpp" #include "Cubed/scene/scene.hpp"
#include "Cubed/ui/error_ui.hpp" #include "Cubed/ui/error_ui.hpp"
#include "Cubed/ui/inventory_ui.hpp"
#include "Cubed/ui/pasue_menu_ui_manager.hpp" #include "Cubed/ui/pasue_menu_ui_manager.hpp"
#include "Cubed/ui/world_ui_manager.hpp" #include "Cubed/ui/world_ui_manager.hpp"
namespace Cubed { namespace Cubed {
@@ -42,6 +43,7 @@ public:
bool is_recording() const; bool is_recording() const;
private: private:
enum class PauseUI { PAUSE_MENU, INVENTORY };
SceneManager& m_scene_manager; SceneManager& m_scene_manager;
DevPanel m_dev_panel; DevPanel m_dev_panel;
Camera m_camera; Camera m_camera;
@@ -53,6 +55,8 @@ private:
bool m_show_dev_pannel = true; bool m_show_dev_pannel = true;
bool m_chatting = false; bool m_chatting = false;
PauseMenuUIManager m_pasue_menu; PauseMenuUIManager m_pasue_menu;
InventoryUI m_inventory_ui;
PauseUI m_paused_ui = PauseUI::PAUSE_MENU;
WorldUIManager m_hud_ui; WorldUIManager m_hud_ui;
ErrorUI m_error_ui; ErrorUI m_error_ui;
const Argument& m_argument; const Argument& m_argument;

View File

@@ -0,0 +1,16 @@
#pragma once
#include "Cubed/ui/ui_manager.hpp"
namespace Cubed {
class WorldScene;
class InventoryUI : public UIManager {
public:
InventoryUI(WorldScene& m_scene);
void init() override;
void on_re_enter();
private:
WorldScene& m_scene;
};
} // namespace Cubed

View File

@@ -91,4 +91,5 @@ target_sources(${PROJECT_NAME}
tools/sensitive_filter.cpp tools/sensitive_filter.cpp
ui/row_layout.cpp ui/row_layout.cpp
ui/item_slot.cpp ui/item_slot.cpp
ui/inventory_ui.cpp
) )

View File

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

45
src/ui/inventory_ui.cpp Normal file
View File

@@ -0,0 +1,45 @@
#include "Cubed/ui/inventory_ui.hpp"
#include "Cubed/app.hpp"
#include "Cubed/scene/scene_manager.hpp"
#include "Cubed/scene/world_scene.hpp"
#include "Cubed/ui/column_layout.hpp"
#include "Cubed/ui/image.hpp"
namespace Cubed {
InventoryUI::InventoryUI(WorldScene& scene) : m_scene(scene) {}
void InventoryUI::init() {
auto back = std::make_unique<Rect>(nullptr);
auto& renderer = m_scene.scene_manager().app().renderer();
auto& texture_manager = m_scene.scene_manager().app().texture_manager();
back->set_window_size(renderer.window_width(), renderer.window_height());
back->set_anchor(Anchor::TOP_LEFT);
back->set_color(Color::BLACK).set_alpha(0.7f);
back->set_fill_parent(true);
auto& column = back->add_child<ColumnLayout>();
column.set_anchor(Anchor::CENTER);
column.set_child_anchor(ColumnLayoutAnchor::LEFT);
auto& block_textures = texture_manager.get_item_textures();
auto sum = block_textures.size();
{
auto& row_layout = column.add_child<RowLayout>();
auto row = &row_layout;
for (size_t i = 0; i < sum; ++i) {
if (i % 10 == 0) {
auto& r = column.add_child<RowLayout>();
row = &r;
}
auto& slot = row->add_child<ItemSlot>();
slot.set_default_background(texture_manager);
slot.set_scale(5.0f);
slot.set_item(i, block_textures[i].get());
}
}
m_root_widget = std::move(back);
}
void InventoryUI::on_re_enter() {}
} // namespace Cubed

View File

@@ -14,7 +14,7 @@ void PauseMenuUIManager::init() {
rect->set_fill_parent(true); rect->set_fill_parent(true);
rect->set_color(Color::BLACK); rect->set_color(Color::BLACK);
rect->set_alpha(0.5f); rect->set_alpha(0.7f);
rect->set_anchor(Anchor::TOP_LEFT); rect->set_anchor(Anchor::TOP_LEFT);
auto& renderer = m_scene.scene_manager().app().renderer(); auto& renderer = m_scene.scene_manager().app().renderer();
rect->set_window_size(renderer.window_width(), renderer.window_height()); rect->set_window_size(renderer.window_width(), renderer.window_height());