From 1908b5e4b796eee32a7a547b41e6670b0fdb51c4 Mon Sep 17 00:00:00 2001 From: sebastian Date: Sun, 15 Feb 2026 19:49:50 +0100 Subject: [PATCH] ADD: Choose Selected Building for Placement by BuildingMenu --- CMakeLists.txt | 2 ++ src/engine/core/gui/uiComponent/UiComponent.h | 7 ++++++ src/game/GameLayer.cpp | 5 ++++ src/game/UILayer.cpp | 9 +++++++ .../events/BuildingTypeSelectEvent.cpp | 5 ++++ .../hexWorld/events/BuildingTypeSelectEvent.h | 16 +++++++++++++ .../buildingMenu/UiBuildingMenuButton.h | 4 ++++ .../buildingMenu/UiBuildingMenuContainer.cpp | 24 ++++++++++++------- .../buildingMenu/UiBuildingMenuContainer.h | 16 +++++++++++++ 9 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 src/game/hexWorld/events/BuildingTypeSelectEvent.cpp create mode 100644 src/game/hexWorld/events/BuildingTypeSelectEvent.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c00f1f2..99d5468 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,6 +246,8 @@ add_executable(Dicewars_Siedler src/main.cpp src/game/ui/components/buildingMenu/UiBuildingMenuButton.h src/game/ui/components/buildingMenu/UiBuildingMenuCostContainer.cpp src/game/ui/components/buildingMenu/UiBuildingMenuCostContainer.h + src/game/hexWorld/events/BuildingTypeSelectEvent.cpp + src/game/hexWorld/events/BuildingTypeSelectEvent.h ) target_compile_options(Dicewars_Siedler PRIVATE diff --git a/src/engine/core/gui/uiComponent/UiComponent.h b/src/engine/core/gui/uiComponent/UiComponent.h index 0824051..702dc76 100644 --- a/src/engine/core/gui/uiComponent/UiComponent.h +++ b/src/engine/core/gui/uiComponent/UiComponent.h @@ -15,6 +15,11 @@ enum class UiElementState { NORMAL, HOVERED, PRESSED }; +struct UiEvent { + bool handled = false; + virtual ~UiEvent() = default; +}; + class UiComponent { public: @@ -40,6 +45,8 @@ public: virtual void onClick() {}; UiComponent* getChildAtIndex(size_t t) const; + + void dispatchEvent(UiEvent& event); protected: bool visible = true; diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index 542715a..6d54527 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -25,6 +25,7 @@ #include "hexWorld/ecs/components/ProducingComponent.h" #include "hexWorld/ecs/systems/CollectResourceSystem.h" #include "hexWorld/ecs/systems/ProducingSystem.h" +#include "hexWorld/events/BuildingTypeSelectEvent.h" #include "hexWorld/events/TurnChangedEvent.h" GameLayer::GameLayer() :texturedModel(0,0) //Platzhalter, echtes Model kommt in onAttach @@ -70,6 +71,10 @@ void GameLayer::onAttach() gameInputUser = std::make_unique(*tileHighlightSystem, *entityManager, *mousePicker, *camera, *gameMode); Application::getInstance().stateManager->registerMouseUser(gameInputUser.get(), {StateRegistry::get().game}); + + events.subscribe([this](const BuildingTypeSelectEvent& event) { + gameMode->setActiveBuilding(event.selectedBuildingType); + }); } void GameLayer::onDetach() diff --git a/src/game/UILayer.cpp b/src/game/UILayer.cpp index 8735654..29a14a3 100644 --- a/src/game/UILayer.cpp +++ b/src/game/UILayer.cpp @@ -17,6 +17,7 @@ #include "../engine/renderer/loader/Loader.h" #include "../engine/renderer/model/GUITexture.h" #include "../engine/renderer/model/RenderTargets.h" +#include "hexWorld/events/BuildingTypeSelectEvent.h" #include "hexWorld/events/TurnChangedEvent.h" #include "ui/components/buildingMenu/UiBuildingMenuContainer.h" #include "ui/components/UiInventoryContainer.h" @@ -115,6 +116,12 @@ void UILayer::onAttach() { rootContainer->addChild(std::move(uiButton)); auto buildingMenuContainer = std::make_unique(*smallFont); + buildingMenuContainer->addBuildingMenuBtnCallback([](UiBuildingMenuButtonClickEvent e) { + if (e.originalEventData.isClick(MouseButton::LEFT)) { + Application::getInstance().getEventBus().emit(BuildingTypeSelectEvent{e.buildingType}); + } + }); + auto buildingMenuContainerContainer = std::make_unique(); buildingMenuContainerContainer->getLayoutStyle().width = SizeValue(1.f, SizeUnit::Percent); buildingMenuContainerContainer->getLayoutStyle().height = SizeValue(200, SizeUnit::Pixels); @@ -123,6 +130,8 @@ void UILayer::onAttach() { buildingMenuContainerContainer->getLayoutStyle().justifyContent = JustifyContent::Center; buildingMenuContainerContainer->addChild(std::move(buildingMenuContainer)); + + rootContainer->addChild(std::move(buildingMenuContainerContainer)); Application::getInstance().stateManager->registerMouseUser(uiInputUser.get(), {StateRegistry::get().uiState}); diff --git a/src/game/hexWorld/events/BuildingTypeSelectEvent.cpp b/src/game/hexWorld/events/BuildingTypeSelectEvent.cpp new file mode 100644 index 0000000..29a2f39 --- /dev/null +++ b/src/game/hexWorld/events/BuildingTypeSelectEvent.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 15.02.26. +// + +#include "BuildingTypeSelectEvent.h" \ No newline at end of file diff --git a/src/game/hexWorld/events/BuildingTypeSelectEvent.h b/src/game/hexWorld/events/BuildingTypeSelectEvent.h new file mode 100644 index 0000000..b76fbfd --- /dev/null +++ b/src/game/hexWorld/events/BuildingTypeSelectEvent.h @@ -0,0 +1,16 @@ +// +// Created by sebastian on 15.02.26. +// + +#ifndef DICEWARS_SIEDLER_BUILDINGTYPESELECTEVENT_H +#define DICEWARS_SIEDLER_BUILDINGTYPESELECTEVENT_H +#include "../ecs/components/BuildingComponent.h" + + +class BuildingTypeSelectEvent { +public: + BuildingType selectedBuildingType; +}; + + +#endif //DICEWARS_SIEDLER_BUILDINGTYPESELECTEVENT_H \ No newline at end of file diff --git a/src/game/ui/components/buildingMenu/UiBuildingMenuButton.h b/src/game/ui/components/buildingMenu/UiBuildingMenuButton.h index 057530c..5006ea3 100644 --- a/src/game/ui/components/buildingMenu/UiBuildingMenuButton.h +++ b/src/game/ui/components/buildingMenu/UiBuildingMenuButton.h @@ -12,6 +12,10 @@ #include "../../../hexWorld/building/BuildingDefinition.h" #include "../../../hexWorld/ecs/components/BuildingComponent.h" +class UiBuildingMenuButton; + + + class UiBuildingMenuButton :public ClickableUiComponent { public: diff --git a/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.cpp b/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.cpp index 2bd0fcd..4623db9 100644 --- a/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.cpp +++ b/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.cpp @@ -21,24 +21,26 @@ UiBuildingMenuContainer::UiBuildingMenuContainer(Font& font) { LayoutStyle buttonStyle; auto forest_icon = std::make_unique("forest_hut_icon", buttonStyle, font, BuildingType::FOREST_HUT); - forest_icon->addMouseListener([](const MouseEventData& e) { - if (e.isClick(MouseButton::LEFT)) { - std::cout << "Forest hut clicked!" << std::endl; - } + forest_icon->addMouseListener([this](const MouseEventData& e) { + UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::FOREST_HUT, e); + onBuildingMenuBtnClick(event); }); addChild(std::move(forest_icon)); LayoutStyle buttonStyle2; auto stone_icon = std::make_unique("stone_mason_icon", buttonStyle2, font, BuildingType::STONE_MASON); - stone_icon->addMouseListener([](const MouseEventData& e) { - if (e.isClick(MouseButton::LEFT)) { - std::cout << "Stone hut clicked!" << std::endl; - } + stone_icon->addMouseListener([this](const MouseEventData& e) { + UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::STONE_MASON, e); + onBuildingMenuBtnClick(event); }); addChild(std::move(stone_icon)); } +void UiBuildingMenuContainer::addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback) { + buildingMenuBtnClickEvents.push_back(std::move(callback)); +} + void UiBuildingMenuContainer::onCollectRenderData(UiRenderBundle &uiRenderBundle) { UiComponent::onCollectRenderData(uiRenderBundle); @@ -49,3 +51,9 @@ void UiBuildingMenuContainer::onCollectRenderData(UiRenderBundle &uiRenderBundle uiRenderBundle.addGUITexture(std::make_shared(textureBuilder.Build())); } + +void UiBuildingMenuContainer::onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent &event) { + for (auto& callback : buildingMenuBtnClickEvents) { + callback(event); + } +} diff --git a/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.h b/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.h index 04810dc..d5041d9 100644 --- a/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.h +++ b/src/game/ui/components/buildingMenu/UiBuildingMenuContainer.h @@ -4,14 +4,30 @@ #ifndef DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H #define DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H +#include "../../../../engine/core/gui/uiComponent/EventData.h" #include "../../../../engine/core/gui/uiComponent/UiComponent.h" +enum class BuildingType; +class UiBuildingMenuButton; + +struct UiBuildingMenuButtonClickEvent { + BuildingType buildingType; + const MouseEventData originalEventData; + + UiBuildingMenuButtonClickEvent(BuildingType buildingType, const MouseEventData originalEventData) : buildingType(buildingType), originalEventData(originalEventData) {} +}; class UiBuildingMenuContainer : public UiComponent { public: + using BuildingMenuBtnClickCallback = std::function; UiBuildingMenuContainer(Font& font); + void addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback); protected: void onCollectRenderData(UiRenderBundle &uiRenderBundle) override; + +private: + std::vector buildingMenuBtnClickEvents; + void onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent& event); };