From 30bdd660861007e49e31f39718a228573c09fad0 Mon Sep 17 00:00:00 2001 From: Redacted Date: Thu, 2 Jan 2025 12:57:21 -0500 Subject: [PATCH] Better scene management. --- include/Engine/{ => Entity}/Animation.h | 2 +- include/Engine/Entity/Entity.h | 2 +- include/Engine/Entity/Renderable.h | 4 ++-- include/Engine/Globals.h | 16 +++++++++++++-- include/Engine/Level/Scene.h | 6 ++++-- include/Game/Scene/ControllableBox.h | 11 ++++++++++ include/Game/Scene/DemoGameScene.h | 12 ----------- include/Game/Scene/{Splash.h => Loading.h} | 8 ++++---- main.cpp | 20 ++++++++++++------- src/Engine/Animation.cpp | 2 +- src/Engine/Level/Scene.cpp | 18 ++++++++++++++++- .../ControllableBox.cpp} | 5 ++--- src/Game/{Splash.cpp => Scene/Loading.cpp} | 19 ++++++++---------- 13 files changed, 78 insertions(+), 47 deletions(-) rename include/Engine/{ => Entity}/Animation.h (95%) create mode 100644 include/Game/Scene/ControllableBox.h delete mode 100644 include/Game/Scene/DemoGameScene.h rename include/Game/Scene/{Splash.h => Loading.h} (53%) rename src/Game/{DemoGameScene.cpp => Scene/ControllableBox.cpp} (71%) rename src/Game/{Splash.cpp => Scene/Loading.cpp} (73%) diff --git a/include/Engine/Animation.h b/include/Engine/Entity/Animation.h similarity index 95% rename from include/Engine/Animation.h rename to include/Engine/Entity/Animation.h index 579e12c..a347d5a 100644 --- a/include/Engine/Animation.h +++ b/include/Engine/Entity/Animation.h @@ -1,6 +1,6 @@ #pragma once -#include "JGL/types/Texture.h" +#include using JGL::Texture; diff --git a/include/Engine/Entity/Entity.h b/include/Engine/Entity/Entity.h index 9da6846..a25d17f 100644 --- a/include/Engine/Entity/Entity.h +++ b/include/Engine/Entity/Entity.h @@ -1,5 +1,5 @@ #pragma once -#include "J3ML/LinearAlgebra/Vector2.hpp" +#include #include class Entity { diff --git a/include/Engine/Entity/Renderable.h b/include/Engine/Entity/Renderable.h index 0deb15a..962cc2f 100644 --- a/include/Engine/Entity/Renderable.h +++ b/include/Engine/Entity/Renderable.h @@ -1,7 +1,7 @@ #pragma once -#include "Entity.h" -#include "JGL/JGL.h" +#include +#include class Renderable : public Entity { public: diff --git a/include/Engine/Globals.h b/include/Engine/Globals.h index 39adcc8..ad719d7 100644 --- a/include/Engine/Globals.h +++ b/include/Engine/Globals.h @@ -4,10 +4,22 @@ #include namespace Globals { + inline std::vector SceneList{}; inline Scene* CurrentScene = nullptr; inline DemoGameWindow* Window = nullptr; inline float DeltaTime() { return Window->GetDeltaTime(); } - inline void RemoveScene() { delete CurrentScene; CurrentScene = nullptr; } - inline void ChangeScene(Scene* scene) { delete CurrentScene; CurrentScene = scene; CurrentScene->Init(); } + inline void ChangeScene(Scene* scene) { if (CurrentScene != nullptr) CurrentScene->Unload(); CurrentScene = scene; if (CurrentScene != nullptr) CurrentScene->Init(); } + inline bool ChangeScene (const std::string& scene_name) + { + Scene* scene = nullptr; + for (auto* s : SceneList) + if (s->GetName() == scene_name) + scene = s; + + if (scene) + ChangeScene(scene); + + return scene; + } } diff --git a/include/Engine/Level/Scene.h b/include/Engine/Level/Scene.h index 711a935..51ab73f 100644 --- a/include/Engine/Level/Scene.h +++ b/include/Engine/Level/Scene.h @@ -7,7 +7,7 @@ class Scene { protected: - bool Paused = false; + std::string name; Hud* HeadsUpDisplay = nullptr; std::vector FixedList{}; std::vector EntityList{}; @@ -16,6 +16,7 @@ public: [[nodiscard]] bool FixedListContains(const Fixed* fixed) const; [[nodiscard]] size_t FixedCount() const; [[nodiscard]] size_t EntityCount() const; + [[nodiscard]] std::string GetName() const; public: void AppendEntity(Entity* entity); void AppendFixed(Fixed* fixed); @@ -28,10 +29,11 @@ public: void RemoveEntity(Entity* entity); void RemoveFixed(Fixed* fixed); + virtual void Unload(); virtual void Init() {} virtual void Update(); virtual void Render(); public: - Scene() = default; + explicit Scene(const std::string& name) : name(name) {} virtual ~Scene(); }; diff --git a/include/Game/Scene/ControllableBox.h b/include/Game/Scene/ControllableBox.h new file mode 100644 index 0000000..959709b --- /dev/null +++ b/include/Game/Scene/ControllableBox.h @@ -0,0 +1,11 @@ +#pragma once +#include + +class ControllableBox final : public Scene { +public: + void Init() final; +public: + explicit ControllableBox(const std::string& name) : Scene(name) {} +}; + + diff --git a/include/Game/Scene/DemoGameScene.h b/include/Game/Scene/DemoGameScene.h deleted file mode 100644 index 2e8bc0a..0000000 --- a/include/Game/Scene/DemoGameScene.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Engine/Level/Scene.h" - -class DemoGameScene final : public Scene { -public: - void Init() final; -public: - DemoGameScene() = default; - -}; - - diff --git a/include/Game/Scene/Splash.h b/include/Game/Scene/Loading.h similarity index 53% rename from include/Game/Scene/Splash.h rename to include/Game/Scene/Loading.h index b0520f2..a9531ba 100644 --- a/include/Game/Scene/Splash.h +++ b/include/Game/Scene/Loading.h @@ -1,16 +1,16 @@ #pragma once -#include "Engine/Level/Scene.h" +#include -class DemoGameSplash final : public Scene { +class LoadingScreen final : public Scene { protected: float elapsed = 0.0f; float angle = 0.0f; Texture* RedactedSoftware = nullptr; public: - DemoGameSplash() : Scene() {} + explicit LoadingScreen(const std::string& name) : Scene(name) {} void Init() final; void Update() final; void Render() final; - ~DemoGameSplash() final; + ~LoadingScreen() final; }; diff --git a/main.cpp b/main.cpp index b200585..91e145f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,12 +1,18 @@ -#include "Engine/Globals.h" -#include +#include #include -#include "Game/Scene/Splash.h" - -Scene* scene = nullptr; +#include +#include using namespace JGL; +void CreateScenes() { + auto ld = new LoadingScreen("LoadingScreen"); + Globals::SceneList.push_back(ld); + + auto cb = new ControllableBox("Scene0"); + Globals::SceneList.push_back(cb); +}; + int main() { Globals::Window = new DemoGameWindow("Demo Game", 1024, 896); Globals::Window->SetRenderer(RenderingAPI::OPENGL); @@ -18,8 +24,8 @@ int main() { ReWindow::Logger::Warning.EnableConsole(false); ReWindow::Logger::Debug.EnableConsole(false); - auto* splash = new DemoGameSplash(); - Globals::ChangeScene(splash); + CreateScenes(); + Globals::ChangeScene("LoadingScreen"); while (Globals::Window->IsAlive()) Globals::Window->ManagedRefresh(); diff --git a/src/Engine/Animation.cpp b/src/Engine/Animation.cpp index a59f8d8..4bf8096 100644 --- a/src/Engine/Animation.cpp +++ b/src/Engine/Animation.cpp @@ -1,4 +1,4 @@ -#include "Engine/Animation.h" +#include "Engine/Entity/Animation.h" #include "jlog/Logger.hpp" float Animation::GetMsBetweenFrames() const { diff --git a/src/Engine/Level/Scene.cpp b/src/Engine/Level/Scene.cpp index 07cbccf..43b0cbd 100644 --- a/src/Engine/Level/Scene.cpp +++ b/src/Engine/Level/Scene.cpp @@ -1,4 +1,4 @@ -#include "Engine/Level/Scene.h" +#include bool Scene::EntityListContains(const Entity* entity) const { for (auto* e : EntityList) @@ -47,6 +47,18 @@ Scene::~Scene() { for (auto* e : EntityList) delete e; + + delete HeadsUpDisplay; +} + +void Scene::Unload() { + for (auto* f : FixedList) + delete f; + + for (auto* e : EntityList) + delete e; + + delete HeadsUpDisplay; } void Scene::AppendEntity(Entity* entity) { @@ -84,3 +96,7 @@ void Scene::RemoveFixed(Fixed* fixed) { FixedList.erase(it); } +std::string Scene::GetName() const { + return name; +} + diff --git a/src/Game/DemoGameScene.cpp b/src/Game/Scene/ControllableBox.cpp similarity index 71% rename from src/Game/DemoGameScene.cpp rename to src/Game/Scene/ControllableBox.cpp index 6deaf2e..01f06a0 100644 --- a/src/Game/DemoGameScene.cpp +++ b/src/Game/Scene/ControllableBox.cpp @@ -1,11 +1,10 @@ -#include +#include #include #include -void DemoGameScene::Init() { +void ControllableBox::Init() { auto* hud = new DemoGameHud(); auto* b = new Box({0, 0}); - HeadsUpDisplay = hud; AppendEntity(b); } diff --git a/src/Game/Splash.cpp b/src/Game/Scene/Loading.cpp similarity index 73% rename from src/Game/Splash.cpp rename to src/Game/Scene/Loading.cpp index 99bcafb..30e5992 100644 --- a/src/Game/Splash.cpp +++ b/src/Game/Scene/Loading.cpp @@ -1,23 +1,20 @@ -#include "Game/Scene/Splash.h" -#include "Engine/Globals.h" -#include "Game/Scene/DemoGameScene.h" +#include +#include -void DemoGameSplash::Init() { +void LoadingScreen::Init() { RedactedSoftware = new JGL::Texture("assets/sprites/Re3D.png"); } -void DemoGameSplash::Update() { +void LoadingScreen::Update() { angle += (elapsed * 4) * Globals::DeltaTime(); elapsed += Globals::DeltaTime(); // Pretend we're actually loading something idk. - if (elapsed >= 2.75) { - auto* dgs = new DemoGameScene(); - Globals::ChangeScene(dgs); - } + if (elapsed >= 2.75) + Globals::ChangeScene("Scene0"); } -void DemoGameSplash::Render() { +void LoadingScreen::Render() { auto text_length = JGL::Fonts::Jupiteroid.MeasureString("Loading ....", 24); std::string text = "Loading"; int dots = static_cast(floor(elapsed / 0.35)) % 4; @@ -31,7 +28,7 @@ void DemoGameSplash::Render() { } -DemoGameSplash::~DemoGameSplash() { +LoadingScreen::~LoadingScreen() { delete RedactedSoftware; }