From 8690efe18433c2e4f7b11f4280de4c423cac9a00 Mon Sep 17 00:00:00 2001 From: sebastian Date: Fri, 7 Aug 2026 18:40:28 +0200 Subject: [PATCH] FIX: Cyclic Includes of Scene and duplicate std::variant --- CMakeLists.txt | 1 + engine/src/core/Application.cpp | 2 +- engine/src/core/events/ApplicationEvents.cpp | 14 ++++++++++++++ engine/src/core/events/ApplicationEvents.h | 15 +++++++++++++-- game/src/mainMenu/layer/MainMenuUiLayer.cpp | 8 ++++++-- game/src/multiplayer/lobby/LobbyScene.cpp | 4 ++++ game/src/multiplayer/lobby/LobbyUiLayer.cpp | 13 ++++++++++++- game/src/multiplayer/lobby/LobbyUiLayer.h | 2 +- 8 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 engine/src/core/events/ApplicationEvents.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a28abf..464d150 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,6 +268,7 @@ add_library(Engine STATIC engine/src/core/events/ApplicationEvents.h engine/src/core/events/EventChannels.cpp engine/src/core/events/EventChannels.h + engine/src/core/events/ApplicationEvents.cpp ) target_include_directories(Engine PUBLIC engine/src ${dr_libs_SOURCE_DIR}) target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui spdlog::spdlog tinyobjloader stb_image OpenAL::OpenAL NetworkCore) diff --git a/engine/src/core/Application.cpp b/engine/src/core/Application.cpp index bd23062..a763a26 100644 --- a/engine/src/core/Application.cpp +++ b/engine/src/core/Application.cpp @@ -23,7 +23,7 @@ namespace engine { if constexpr (std::is_same_v) { m_window->requestWindowClose(); } else if constexpr (std::is_same_v) { - m_sceneManager.switchTo(e.nextScene, std::move(e.onSceneLoaded)); + m_sceneManager.switchTo(std::move(e.nextScene), std::move(e.onSceneLoaded)); } }, event); }); diff --git a/engine/src/core/events/ApplicationEvents.cpp b/engine/src/core/events/ApplicationEvents.cpp new file mode 100644 index 0000000..acfd555 --- /dev/null +++ b/engine/src/core/events/ApplicationEvents.cpp @@ -0,0 +1,14 @@ +// +// Created by sebastian on 07.08.26. +// +#include "ApplicationEvents.h" +#include "layer/Scene.h" // hier ist Scene vollständig bekannt + +SceneSwitchRequested::SceneSwitchRequested() = default; + +SceneSwitchRequested::SceneSwitchRequested(std::unique_ptr scene, std::function callback) : nextScene(std::move(scene)), onSceneLoaded(std::move(callback)){ +} + +SceneSwitchRequested::~SceneSwitchRequested() = default; +SceneSwitchRequested::SceneSwitchRequested(SceneSwitchRequested&&) noexcept = default; +SceneSwitchRequested& SceneSwitchRequested::operator=(SceneSwitchRequested&&) noexcept = default; \ No newline at end of file diff --git a/engine/src/core/events/ApplicationEvents.h b/engine/src/core/events/ApplicationEvents.h index 0271901..e128d2e 100644 --- a/engine/src/core/events/ApplicationEvents.h +++ b/engine/src/core/events/ApplicationEvents.h @@ -4,17 +4,28 @@ #ifndef COLORRACE_APPLICATIONEVENTS_H #define COLORRACE_APPLICATIONEVENTS_H +#include +#include #include -#include "layer/Scene.h" + +namespace engine { + class Scene; +} struct QuitRequested {}; struct SceneSwitchRequested { std::unique_ptr nextScene; std::function onSceneLoaded; + + SceneSwitchRequested(); + SceneSwitchRequested(std::unique_ptr scene, std::function callback); + ~SceneSwitchRequested(); + SceneSwitchRequested(SceneSwitchRequested&&) noexcept; + SceneSwitchRequested& operator=(SceneSwitchRequested&&) noexcept; }; -using ApplicationEvents = std::variant; +using ApplicationEvents = std::variant; #endif //COLORRACE_APPLICATIONEVENTS_H diff --git a/game/src/mainMenu/layer/MainMenuUiLayer.cpp b/game/src/mainMenu/layer/MainMenuUiLayer.cpp index 1b0da62..8fa8d3c 100644 --- a/game/src/mainMenu/layer/MainMenuUiLayer.cpp +++ b/game/src/mainMenu/layer/MainMenuUiLayer.cpp @@ -71,8 +71,12 @@ void MainMenuUiLayer::onAttachImpl() { if (e.success) { spdlog::info("Received positive Connection Result"); m_connectionError = false; - std::unique_ptr lobbyScene = std::make_unique(m_applicationEventBus, getInputStack(), getKeyboard(), getMouse()); - + std::unique_ptr lobbyScene = std::make_unique(m_applicationEventBus, getInputStack(), getKeyboard(), getMouse()); + m_closeConnectPopup = true; + ApplicationEvents switchToLobby = SceneSwitchRequested{std::move(lobbyScene), []() { + spdlog::info("Lobby Scene loaded"); + }}; + m_applicationEventBus->publish(switchToLobby); } else { spdlog::info("Received negative Connection Result"); m_connectionError = true; diff --git a/game/src/multiplayer/lobby/LobbyScene.cpp b/game/src/multiplayer/lobby/LobbyScene.cpp index b85f15d..24b0147 100644 --- a/game/src/multiplayer/lobby/LobbyScene.cpp +++ b/game/src/multiplayer/lobby/LobbyScene.cpp @@ -4,6 +4,8 @@ #include "LobbyScene.h" +#include "LobbyUiLayer.h" + std::vector LobbyScene::getRequiredAssets() const { std::vector requests; requests.emplace_back(engine::TextureRequest("lobby_background", "assets/textures/multiplayer_lobby.png")); @@ -12,6 +14,8 @@ std::vector LobbyScene::getRequiredAssets() const { void LobbyScene::onEnter() { Scene::onEnter(); + + addLayer(std::make_unique(m_keyboard, m_mouse, getAnimationEventBus(), m_applicationEventBus, *assetManager)); } void LobbyScene::onExit() { diff --git a/game/src/multiplayer/lobby/LobbyUiLayer.cpp b/game/src/multiplayer/lobby/LobbyUiLayer.cpp index 4892d89..370e071 100644 --- a/game/src/multiplayer/lobby/LobbyUiLayer.cpp +++ b/game/src/multiplayer/lobby/LobbyUiLayer.cpp @@ -4,6 +4,8 @@ #include "LobbyUiLayer.h" +#include "spdlog/spdlog.h" + void LobbyUiLayer::onAttachImpl() { Layer::onAttachImpl(); @@ -12,8 +14,17 @@ void LobbyUiLayer::onAttachImpl() { backgroundImage = std::make_unique(backgroundTexture, glm::vec2(0,0), glm::vec2(1,1)); } +void LobbyUiLayer::onDetachImpl() { + Layer::onDetachImpl(); +} + void LobbyUiLayer::onRender() { std::vector guiElements; guiElements.emplace_back(*backgroundImage); m_guiRenderer.render(guiElements); -} \ No newline at end of file +} + +void LobbyUiLayer::onUpdate(float deltaTime) { + Layer::onUpdate(deltaTime); + +} diff --git a/game/src/multiplayer/lobby/LobbyUiLayer.h b/game/src/multiplayer/lobby/LobbyUiLayer.h index 0228adf..74f0cbb 100644 --- a/game/src/multiplayer/lobby/LobbyUiLayer.h +++ b/game/src/multiplayer/lobby/LobbyUiLayer.h @@ -19,7 +19,7 @@ public: LobbyUiLayer(engine::Keyboard &keyboard, engine::Mouse &mouse, engine::EventBus &animationEventBus, - const std::shared_ptr>> &applicationEventBus, engine::AssetManager& assetManager) + const std::shared_ptr> &applicationEventBus, engine::AssetManager& assetManager) : Layer(keyboard, mouse, animationEventBus, applicationEventBus), m_assetManager(assetManager) { }