ADD: Choose Selected Building for Placement by BuildingMenu

This commit is contained in:
sebastian 2026-02-15 19:49:50 +01:00
parent d2f9d3541c
commit 1908b5e4b7
9 changed files with 80 additions and 8 deletions

View File

@ -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

View File

@ -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;

View File

@ -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<GameInputUser>(*tileHighlightSystem, *entityManager, *mousePicker, *camera, *gameMode);
Application::getInstance().stateManager->registerMouseUser(gameInputUser.get(), {StateRegistry::get().game});
events.subscribe<BuildingTypeSelectEvent>([this](const BuildingTypeSelectEvent& event) {
gameMode->setActiveBuilding(event.selectedBuildingType);
});
}
void GameLayer::onDetach()

View File

@ -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<UiBuildingMenuContainer>(*smallFont);
buildingMenuContainer->addBuildingMenuBtnCallback([](UiBuildingMenuButtonClickEvent e) {
if (e.originalEventData.isClick(MouseButton::LEFT)) {
Application::getInstance().getEventBus().emit(BuildingTypeSelectEvent{e.buildingType});
}
});
auto buildingMenuContainerContainer = std::make_unique<UiContainer>();
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});

View File

@ -0,0 +1,5 @@
//
// Created by sebastian on 15.02.26.
//
#include "BuildingTypeSelectEvent.h"

View File

@ -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

View File

@ -12,6 +12,10 @@
#include "../../../hexWorld/building/BuildingDefinition.h"
#include "../../../hexWorld/ecs/components/BuildingComponent.h"
class UiBuildingMenuButton;
class UiBuildingMenuButton :public ClickableUiComponent {
public:

View File

@ -21,24 +21,26 @@ UiBuildingMenuContainer::UiBuildingMenuContainer(Font& font) {
LayoutStyle buttonStyle;
auto forest_icon = std::make_unique<UiBuildingMenuButton>("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<UiBuildingMenuButton>("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<GUITexture>(textureBuilder.Build()));
}
void UiBuildingMenuContainer::onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent &event) {
for (auto& callback : buildingMenuBtnClickEvents) {
callback(event);
}
}

View File

@ -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<void(const UiBuildingMenuButtonClickEvent&)>;
UiBuildingMenuContainer(Font& font);
void addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback);
protected:
void onCollectRenderData(UiRenderBundle &uiRenderBundle) override;
private:
std::vector<BuildingMenuBtnClickCallback> buildingMenuBtnClickEvents;
void onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent& event);
};