ADD: Choose Selected Building for Placement by BuildingMenu
This commit is contained in:
parent
d2f9d3541c
commit
1908b5e4b7
@ -246,6 +246,8 @@ add_executable(Dicewars_Siedler src/main.cpp
|
|||||||
src/game/ui/components/buildingMenu/UiBuildingMenuButton.h
|
src/game/ui/components/buildingMenu/UiBuildingMenuButton.h
|
||||||
src/game/ui/components/buildingMenu/UiBuildingMenuCostContainer.cpp
|
src/game/ui/components/buildingMenu/UiBuildingMenuCostContainer.cpp
|
||||||
src/game/ui/components/buildingMenu/UiBuildingMenuCostContainer.h
|
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
|
target_compile_options(Dicewars_Siedler PRIVATE
|
||||||
|
|||||||
@ -15,6 +15,11 @@ enum class UiElementState {
|
|||||||
NORMAL, HOVERED, PRESSED
|
NORMAL, HOVERED, PRESSED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct UiEvent {
|
||||||
|
bool handled = false;
|
||||||
|
virtual ~UiEvent() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class UiComponent {
|
class UiComponent {
|
||||||
public:
|
public:
|
||||||
@ -40,6 +45,8 @@ public:
|
|||||||
virtual void onClick() {};
|
virtual void onClick() {};
|
||||||
|
|
||||||
UiComponent* getChildAtIndex(size_t t) const;
|
UiComponent* getChildAtIndex(size_t t) const;
|
||||||
|
|
||||||
|
void dispatchEvent(UiEvent& event);
|
||||||
protected:
|
protected:
|
||||||
bool visible = true;
|
bool visible = true;
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include "hexWorld/ecs/components/ProducingComponent.h"
|
#include "hexWorld/ecs/components/ProducingComponent.h"
|
||||||
#include "hexWorld/ecs/systems/CollectResourceSystem.h"
|
#include "hexWorld/ecs/systems/CollectResourceSystem.h"
|
||||||
#include "hexWorld/ecs/systems/ProducingSystem.h"
|
#include "hexWorld/ecs/systems/ProducingSystem.h"
|
||||||
|
#include "hexWorld/events/BuildingTypeSelectEvent.h"
|
||||||
#include "hexWorld/events/TurnChangedEvent.h"
|
#include "hexWorld/events/TurnChangedEvent.h"
|
||||||
|
|
||||||
GameLayer::GameLayer() :texturedModel(0,0) //Platzhalter, echtes Model kommt in onAttach
|
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);
|
gameInputUser = std::make_unique<GameInputUser>(*tileHighlightSystem, *entityManager, *mousePicker, *camera, *gameMode);
|
||||||
Application::getInstance().stateManager->registerMouseUser(gameInputUser.get(), {StateRegistry::get().game});
|
Application::getInstance().stateManager->registerMouseUser(gameInputUser.get(), {StateRegistry::get().game});
|
||||||
|
|
||||||
|
events.subscribe<BuildingTypeSelectEvent>([this](const BuildingTypeSelectEvent& event) {
|
||||||
|
gameMode->setActiveBuilding(event.selectedBuildingType);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameLayer::onDetach()
|
void GameLayer::onDetach()
|
||||||
|
|||||||
@ -17,6 +17,7 @@
|
|||||||
#include "../engine/renderer/loader/Loader.h"
|
#include "../engine/renderer/loader/Loader.h"
|
||||||
#include "../engine/renderer/model/GUITexture.h"
|
#include "../engine/renderer/model/GUITexture.h"
|
||||||
#include "../engine/renderer/model/RenderTargets.h"
|
#include "../engine/renderer/model/RenderTargets.h"
|
||||||
|
#include "hexWorld/events/BuildingTypeSelectEvent.h"
|
||||||
#include "hexWorld/events/TurnChangedEvent.h"
|
#include "hexWorld/events/TurnChangedEvent.h"
|
||||||
#include "ui/components/buildingMenu/UiBuildingMenuContainer.h"
|
#include "ui/components/buildingMenu/UiBuildingMenuContainer.h"
|
||||||
#include "ui/components/UiInventoryContainer.h"
|
#include "ui/components/UiInventoryContainer.h"
|
||||||
@ -115,6 +116,12 @@ void UILayer::onAttach() {
|
|||||||
rootContainer->addChild(std::move(uiButton));
|
rootContainer->addChild(std::move(uiButton));
|
||||||
|
|
||||||
auto buildingMenuContainer = std::make_unique<UiBuildingMenuContainer>(*smallFont);
|
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>();
|
auto buildingMenuContainerContainer = std::make_unique<UiContainer>();
|
||||||
buildingMenuContainerContainer->getLayoutStyle().width = SizeValue(1.f, SizeUnit::Percent);
|
buildingMenuContainerContainer->getLayoutStyle().width = SizeValue(1.f, SizeUnit::Percent);
|
||||||
buildingMenuContainerContainer->getLayoutStyle().height = SizeValue(200, SizeUnit::Pixels);
|
buildingMenuContainerContainer->getLayoutStyle().height = SizeValue(200, SizeUnit::Pixels);
|
||||||
@ -123,6 +130,8 @@ void UILayer::onAttach() {
|
|||||||
buildingMenuContainerContainer->getLayoutStyle().justifyContent = JustifyContent::Center;
|
buildingMenuContainerContainer->getLayoutStyle().justifyContent = JustifyContent::Center;
|
||||||
buildingMenuContainerContainer->addChild(std::move(buildingMenuContainer));
|
buildingMenuContainerContainer->addChild(std::move(buildingMenuContainer));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rootContainer->addChild(std::move(buildingMenuContainerContainer));
|
rootContainer->addChild(std::move(buildingMenuContainerContainer));
|
||||||
|
|
||||||
Application::getInstance().stateManager->registerMouseUser(uiInputUser.get(), {StateRegistry::get().uiState});
|
Application::getInstance().stateManager->registerMouseUser(uiInputUser.get(), {StateRegistry::get().uiState});
|
||||||
|
|||||||
5
src/game/hexWorld/events/BuildingTypeSelectEvent.cpp
Normal file
5
src/game/hexWorld/events/BuildingTypeSelectEvent.cpp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 15.02.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "BuildingTypeSelectEvent.h"
|
||||||
16
src/game/hexWorld/events/BuildingTypeSelectEvent.h
Normal file
16
src/game/hexWorld/events/BuildingTypeSelectEvent.h
Normal 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
|
||||||
@ -12,6 +12,10 @@
|
|||||||
#include "../../../hexWorld/building/BuildingDefinition.h"
|
#include "../../../hexWorld/building/BuildingDefinition.h"
|
||||||
#include "../../../hexWorld/ecs/components/BuildingComponent.h"
|
#include "../../../hexWorld/ecs/components/BuildingComponent.h"
|
||||||
|
|
||||||
|
class UiBuildingMenuButton;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class UiBuildingMenuButton :public ClickableUiComponent {
|
class UiBuildingMenuButton :public ClickableUiComponent {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -21,24 +21,26 @@ UiBuildingMenuContainer::UiBuildingMenuContainer(Font& font) {
|
|||||||
LayoutStyle buttonStyle;
|
LayoutStyle buttonStyle;
|
||||||
|
|
||||||
auto forest_icon = std::make_unique<UiBuildingMenuButton>("forest_hut_icon", buttonStyle, font, BuildingType::FOREST_HUT);
|
auto forest_icon = std::make_unique<UiBuildingMenuButton>("forest_hut_icon", buttonStyle, font, BuildingType::FOREST_HUT);
|
||||||
forest_icon->addMouseListener([](const MouseEventData& e) {
|
forest_icon->addMouseListener([this](const MouseEventData& e) {
|
||||||
if (e.isClick(MouseButton::LEFT)) {
|
UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::FOREST_HUT, e);
|
||||||
std::cout << "Forest hut clicked!" << std::endl;
|
onBuildingMenuBtnClick(event);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
addChild(std::move(forest_icon));
|
addChild(std::move(forest_icon));
|
||||||
|
|
||||||
LayoutStyle buttonStyle2;
|
LayoutStyle buttonStyle2;
|
||||||
|
|
||||||
auto stone_icon = std::make_unique<UiBuildingMenuButton>("stone_mason_icon", buttonStyle2, font, BuildingType::STONE_MASON);
|
auto stone_icon = std::make_unique<UiBuildingMenuButton>("stone_mason_icon", buttonStyle2, font, BuildingType::STONE_MASON);
|
||||||
stone_icon->addMouseListener([](const MouseEventData& e) {
|
stone_icon->addMouseListener([this](const MouseEventData& e) {
|
||||||
if (e.isClick(MouseButton::LEFT)) {
|
UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::STONE_MASON, e);
|
||||||
std::cout << "Stone hut clicked!" << std::endl;
|
onBuildingMenuBtnClick(event);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
addChild(std::move(stone_icon));
|
addChild(std::move(stone_icon));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UiBuildingMenuContainer::addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback) {
|
||||||
|
buildingMenuBtnClickEvents.push_back(std::move(callback));
|
||||||
|
}
|
||||||
|
|
||||||
void UiBuildingMenuContainer::onCollectRenderData(UiRenderBundle &uiRenderBundle) {
|
void UiBuildingMenuContainer::onCollectRenderData(UiRenderBundle &uiRenderBundle) {
|
||||||
UiComponent::onCollectRenderData(uiRenderBundle);
|
UiComponent::onCollectRenderData(uiRenderBundle);
|
||||||
|
|
||||||
@ -49,3 +51,9 @@ void UiBuildingMenuContainer::onCollectRenderData(UiRenderBundle &uiRenderBundle
|
|||||||
|
|
||||||
uiRenderBundle.addGUITexture(std::make_shared<GUITexture>(textureBuilder.Build()));
|
uiRenderBundle.addGUITexture(std::make_shared<GUITexture>(textureBuilder.Build()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UiBuildingMenuContainer::onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent &event) {
|
||||||
|
for (auto& callback : buildingMenuBtnClickEvents) {
|
||||||
|
callback(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -4,14 +4,30 @@
|
|||||||
|
|
||||||
#ifndef DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H
|
#ifndef DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H
|
||||||
#define DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H
|
#define DICEWARS_SIEDLER_UIBUILDINGMENUCONTAINER_H
|
||||||
|
#include "../../../../engine/core/gui/uiComponent/EventData.h"
|
||||||
#include "../../../../engine/core/gui/uiComponent/UiComponent.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 {
|
class UiBuildingMenuContainer : public UiComponent {
|
||||||
public:
|
public:
|
||||||
|
using BuildingMenuBtnClickCallback = std::function<void(const UiBuildingMenuButtonClickEvent&)>;
|
||||||
UiBuildingMenuContainer(Font& font);
|
UiBuildingMenuContainer(Font& font);
|
||||||
|
void addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback);
|
||||||
protected:
|
protected:
|
||||||
void onCollectRenderData(UiRenderBundle &uiRenderBundle) override;
|
void onCollectRenderData(UiRenderBundle &uiRenderBundle) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<BuildingMenuBtnClickCallback> buildingMenuBtnClickEvents;
|
||||||
|
void onBuildingMenuBtnClick(const UiBuildingMenuButtonClickEvent& event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user