diff --git a/CMakeLists.txt b/CMakeLists.txt index 4321675..ec85778 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,8 @@ add_executable(Dicewars_Siedler src/main.cpp src/engine/core/gui/uiComponent/UiButton.h src/engine/renderer/model/GUIText.cpp src/engine/renderer/model/GUIText.h + src/game/ui/components/UiRessourceWidget.cpp + src/game/ui/components/UiRessourceWidget.h ) target_include_directories(Dicewars_Siedler PRIVATE diff --git a/assets/ui/ressource-icons/granite.png b/assets/ui/ressource-icons/granite.png new file mode 100644 index 0000000..e20c14e Binary files /dev/null and b/assets/ui/ressource-icons/granite.png differ diff --git a/assets/ui/ressource-icons/wood-log.png b/assets/ui/ressource-icons/wood-log.png new file mode 100644 index 0000000..9022cb9 Binary files /dev/null and b/assets/ui/ressource-icons/wood-log.png differ diff --git a/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp b/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp index 616812e..657bb83 100644 --- a/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp +++ b/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp @@ -7,6 +7,7 @@ #include "../UiComponent.h" #include "../UiText.h" #include "../../../Application.h" +#include "../../../../../game/ui/components/UiRessourceWidget.h" #include "../../text/Font.h" void UiPositioner::compute(const Dimensions &parent) { @@ -25,9 +26,11 @@ void UiPositioner::compute(const Dimensions &parent) { // 3. Kinder rekursiv positionieren mit JustifyContent + for (auto& child : uiComponent.children) { child->uiPositioner.compute(screenSpace); } + float totalChildrenMainSize = 0.0f; // 3a. Gesamtgröße der Kinder berechnen (inkl. Top/Left Margins) for (auto& child : uiComponent.children) { @@ -63,6 +66,7 @@ void UiPositioner::compute(const Dimensions &parent) { } + // 3. Kinder rekursiv positionieren float currentMainOffset = justifyOffset; bool first = true; @@ -72,13 +76,13 @@ void UiPositioner::compute(const Dimensions &parent) { } if (style.flexDirection == FlexDirection::Column) { - child->uiPositioner.screenSpace.y = screenSpace.y + currentMainOffset; + child->uiPositioner.offsetPosition(0.f,currentMainOffset); currentMainOffset += child->uiPositioner.screenSpace.height; - currentMainOffset += child->uiPositioner.resolve(child->uiPositioner.style.margin.top, parent.height, screenHeight); + currentMainOffset += child->uiPositioner.resolve(child->uiPositioner.style.margin.top, screenSpace.height, screenHeight); } else { - child->uiPositioner.screenSpace.x += currentMainOffset; + child->uiPositioner.offsetPosition(currentMainOffset,0.f); currentMainOffset += child->uiPositioner.screenSpace.width; - currentMainOffset += child->uiPositioner.resolve(child->uiPositioner.style.margin.left, parent.width, screenWidth); + currentMainOffset += child->uiPositioner.resolve(child->uiPositioner.style.margin.left, screenSpace.width, screenWidth); } first = false; @@ -91,18 +95,16 @@ void UiPositioner::compute(const Dimensions &parent) { float remainingCrossSpace = screenSpace.width - child->uiPositioner.screenSpace.width ; switch (style.alignItems) { case AlignItems::Start: - child->uiPositioner.screenSpace.x = screenSpace.x + marginLeft; + child->uiPositioner.updatePosition(screenSpace.x + marginLeft, child->uiPositioner.screenSpace.y); break; case AlignItems::Center: - child->uiPositioner.screenSpace.x = - screenSpace.x + remainingCrossSpace / 2.0f + marginLeft; + child->uiPositioner.updatePosition(screenSpace.x + remainingCrossSpace / 2.0f + marginLeft, child->uiPositioner.screenSpace.y); break; case AlignItems::End: - child->uiPositioner.screenSpace.x = screenSpace.x + remainingCrossSpace + marginLeft; + child->uiPositioner.updatePosition(screenSpace.x + remainingCrossSpace + marginLeft, child->uiPositioner.screenSpace.y); break; - default: break; } @@ -111,17 +113,15 @@ void UiPositioner::compute(const Dimensions &parent) { float marginTop = child->uiPositioner.resolve(child->uiPositioner.style.margin.top,screenSpace.height,screenHeight); switch (style.alignItems) { case AlignItems::Start: - child->uiPositioner.screenSpace.y = screenSpace.y + marginTop; + child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + marginTop); break; case AlignItems::Center: - child->uiPositioner.screenSpace.y = - screenSpace.y + remainingCrossSpace / 2.0f + marginTop; + child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + remainingCrossSpace / 2.0f + marginTop); break; case AlignItems::End: - child->uiPositioner.screenSpace.y = - screenSpace.y + remainingCrossSpace + marginTop; + child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + remainingCrossSpace + marginTop); break; default: @@ -130,6 +130,7 @@ void UiPositioner::compute(const Dimensions &parent) { } } + } LayoutStyle & UiPositioner::getLayout() { @@ -152,4 +153,22 @@ float UiPositioner::resolve(const SizeValue &size, float parentSize, float axisL } } +void UiPositioner::offsetPosition(float dx, float dy) { + screenSpace.x += dx; + screenSpace.y += dy; + + for (auto& child : uiComponent.children) { + child->uiPositioner.offsetPosition(dx, dy); + } +} + +void UiPositioner::updatePosition(float newX, float newY) { + screenSpace.x = newX; + screenSpace.y = newY; + + for (auto& child : uiComponent.children) { + child->uiPositioner.updatePosition(newX, newY); + } +} + diff --git a/src/engine/core/gui/uiComponent/layout/UiPositioner.h b/src/engine/core/gui/uiComponent/layout/UiPositioner.h index fa2be2c..7610f8d 100644 --- a/src/engine/core/gui/uiComponent/layout/UiPositioner.h +++ b/src/engine/core/gui/uiComponent/layout/UiPositioner.h @@ -27,6 +27,8 @@ private: LayoutStyle style; float resolve(const SizeValue &size, float parentSize, float axisLength); + void offsetPosition(float dx, float dy); + void updatePosition(float newX, float newY); }; diff --git a/src/game/UILayer.cpp b/src/game/UILayer.cpp index d0b4f77..7c1431e 100644 --- a/src/game/UILayer.cpp +++ b/src/game/UILayer.cpp @@ -13,6 +13,7 @@ #include "../engine/core/gui/uiComponent/UiText.h" #include "../engine/renderer/loader/Loader.h" #include "../engine/renderer/model/GUITexture.h" +#include "ui/components/UiRessourceWidget.h" UILayer::UILayer() { Loader& loader = Loader::instance(); @@ -24,10 +25,8 @@ void UILayer::onAttach() { Layer::onAttach(); - rootContainer = std::make_unique(); - LayoutStyle& rootLayout = rootContainer->getLayoutStyle(); - rootLayout.justifyContent = JustifyContent::End; + rootContainer->getLayoutStyle().flexDirection = FlexDirection::Row; auto imageStyle = LayoutStyle(); imageStyle.width = SizeValue(0.25f, SizeUnit::Percent); @@ -46,9 +45,9 @@ void UILayer::onAttach() { ); auto image3 = std::make_unique( - Loader::instance().loadTextureFromFile("assets/textures/texture.png").getTextureID(), - imageStyle -); + Loader::instance().loadTextureFromFile("assets/textures/texture.png").getTextureID(), + imageStyle + ); Font myFont("/usr/share/fonts/TTF/DejaVuSans.ttf", 48); font = std::make_unique(myFont); @@ -60,7 +59,44 @@ void UILayer::onAttach() { std::cout << "Button Clicked!" << std::endl; }); - rootContainer->addChild(std::move(button)); + //rootContainer->addChild(std::move(button)); + + auto inventoryContainer = std::make_unique(); + inventoryContainer->getLayoutStyle().flexDirection = FlexDirection::Row; + inventoryContainer->getLayoutStyle().width = SizeValue(300.f, SizeUnit::Pixels); // Platz für mehrere Ressourcen + inventoryContainer->getLayoutStyle().height = SizeValue(60.f, SizeUnit::Pixels); + inventoryContainer->getLayoutStyle().margin.left = {100.f, SizeUnit::Pixels}; + inventoryContainer->getLayoutStyle().alignItems = AlignItems::Center; + + smallFont =std::make_unique("/usr/share/fonts/TTF/DejaVuSans.ttf", 18); + LayoutStyle iconStyle; + iconStyle.width = SizeValue(60.f, SizeUnit::Pixels); + iconStyle.height = SizeValue(60.f,SizeUnit::Pixels); + + LayoutStyle textStyle; + textStyle.margin.top = {2.f, SizeUnit::Pixels}; + textStyle.width = SizeValue(1.f, SizeUnit::Percent); + textStyle.height = SizeValue(30.f, SizeUnit::Percent); // Rest für Text + + LayoutStyle containerStyle; + containerStyle.width = SizeValue(60.f, SizeUnit::Pixels); // genug Platz für Icon + Text + containerStyle.height = SizeValue(60.f, SizeUnit::Pixels); + containerStyle.flexDirection = FlexDirection::Column; + containerStyle.alignItems = AlignItems::Center; // ganz wichtig für horizontale Zentrierung + + LayoutStyle container2Style; + container2Style.width = SizeValue(60.f, SizeUnit::Pixels); // genug Platz für Icon + Text + container2Style.height = SizeValue(60.f, SizeUnit::Pixels); + container2Style.flexDirection = FlexDirection::Column; + container2Style.alignItems = AlignItems::Center; // ganz wichtig für horizontale Zentrierung + container2Style.margin.left = {10.f, SizeUnit::Pixels}; + + auto wood_widget = std::make_unique(Loader::instance().loadTextureFromFile("assets/ui/ressource-icons/wood-log.png").getTextureID(), 10, *smallFont, containerStyle, iconStyle, textStyle); + auto stone_widget = std::make_unique(Loader::instance().loadTextureFromFile("assets/ui/ressource-icons/granite.png").getTextureID(), 1139, *smallFont, containerStyle, iconStyle, textStyle); + + rootContainer->addChild(std::move(wood_widget)); + rootContainer->addChild(std::move(stone_widget)); + } void UILayer::onUpdate() { diff --git a/src/game/UILayer.h b/src/game/UILayer.h index 1084f46..fd7a8d9 100644 --- a/src/game/UILayer.h +++ b/src/game/UILayer.h @@ -18,6 +18,7 @@ private: std::unique_ptr guiRenderer; std::unique_ptr textRenderer; std::unique_ptr font; + std::unique_ptr smallFont; std::unique_ptr rootContainer; public: UILayer(); diff --git a/src/game/ui/components/UiRessourceWidget.cpp b/src/game/ui/components/UiRessourceWidget.cpp new file mode 100644 index 0000000..01f94e1 --- /dev/null +++ b/src/game/ui/components/UiRessourceWidget.cpp @@ -0,0 +1,21 @@ +// +// Created by sebastian on 12.02.26. +// + +#include "UiRessourceWidget.h" + +#include "../../../engine/core/gui/uiComponent/UiText.h" + +UiRessourceWidget::UiRessourceWidget(GLuint iconTextureID, int amount, Font &font, LayoutStyle &containerStyle, + LayoutStyle &iconStyle, LayoutStyle &textStyle) : UiComponent(containerStyle) { + + icon = std::make_unique(iconTextureID, iconStyle); + text = std::make_unique(font, std::to_string(amount), textStyle); + + addChild(std::move(icon)); + addChild(std::move(text)); +} + +void UiRessourceWidget::setAmount(int newAmount) { + text->setText(std::to_string(newAmount)); +} diff --git a/src/game/ui/components/UiRessourceWidget.h b/src/game/ui/components/UiRessourceWidget.h new file mode 100644 index 0000000..aa541ca --- /dev/null +++ b/src/game/ui/components/UiRessourceWidget.h @@ -0,0 +1,22 @@ +// +// Created by sebastian on 12.02.26. +// + +#ifndef DICEWARS_SIEDLER_UIRESSOURCEWIDGET_H +#define DICEWARS_SIEDLER_UIRESSOURCEWIDGET_H +#include "../../../engine/core/gui/uiComponent/UiComponent.h" +#include "../../../engine/core/gui/uiComponent/UiImage.h" +#include "../../../engine/core/gui/uiMain/UiContainer.h" + + +class UiRessourceWidget : public UiComponent { +public: + UiRessourceWidget(GLuint iconTextureID, int amount, Font& font, LayoutStyle& containerStyle, LayoutStyle& iconStyle, LayoutStyle& textStyle); + void setAmount(int newAmount); +private: + std::unique_ptr icon; + std::unique_ptr text; +}; + + +#endif //DICEWARS_SIEDLER_UIRESSOURCEWIDGET_H \ No newline at end of file