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/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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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});
|
||||
|
||||
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/ecs/components/BuildingComponent.h"
|
||||
|
||||
class UiBuildingMenuButton;
|
||||
|
||||
|
||||
|
||||
|
||||
class UiBuildingMenuButton :public ClickableUiComponent {
|
||||
public:
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user