From 382cf5d006d4266facc4dadfd49c5b8a8744486c Mon Sep 17 00:00:00 2001 From: bog Date: Fri, 27 Oct 2023 12:33:42 +0200 Subject: [PATCH] :sparkles: scene system and empty world scene. --- meson.build | 5 +++++ src/Game.cpp | 19 +++++++++++++----- src/Game.hpp | 3 ++- src/commons.hpp | 1 + src/main.cpp | 9 ++------- src/ml.hpp | 1 + src/scenes/Scene.cpp | 12 +++++++++++ src/scenes/Scene.hpp | 22 +++++++++++++++++++++ src/scenes/Scenes.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++ src/scenes/Scenes.hpp | 44 +++++++++++++++++++++++++++++++++++++++++ src/scenes/World.cpp | 22 +++++++++++++++++++++ src/scenes/World.hpp | 22 +++++++++++++++++++++ 12 files changed, 193 insertions(+), 13 deletions(-) create mode 100644 src/scenes/Scene.cpp create mode 100644 src/scenes/Scene.hpp create mode 100644 src/scenes/Scenes.cpp create mode 100644 src/scenes/Scenes.hpp create mode 100644 src/scenes/World.cpp create mode 100644 src/scenes/World.hpp diff --git a/meson.build b/meson.build index bb69ecb..486bf65 100644 --- a/meson.build +++ b/meson.build @@ -30,6 +30,11 @@ executable( 'src/Sprite.cpp', 'src/Manifest.cpp', + # Scenes + 'src/scenes/Scenes.cpp', + 'src/scenes/Scene.cpp', + 'src/scenes/World.cpp', + # Logs 'src/logs/Logs.cpp', 'src/logs/FileLogs.cpp', diff --git a/src/Game.cpp b/src/Game.cpp index 474fa04..388ab75 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -1,11 +1,8 @@ #include "Game.hpp" -#include "logs/FileLogs.hpp" -#include "events/Events.hpp" -#include "logs/Logs.hpp" -#include "gfx/Graphics.hpp" -#include "inputs/Inputs.hpp" +#include "ml.hpp" #include "Sprite.hpp" +#include "scenes/World.hpp" namespace ml { @@ -20,6 +17,7 @@ namespace ml void Game::start() { ML_SYS(FileLogs)->log(LEVEL_INFO, "game started"); + ML_SYS(Scenes)->queue_add("world"); m_running = true; @@ -28,8 +26,12 @@ namespace ml Sprite sprite {256.0f, 256.0f, 128.0f, 128.0f}; sprite.set_texture("demo"); + float dt = 0.0f; + while (m_running) { + auto now = std::chrono::steady_clock::now(); + while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) @@ -43,9 +45,16 @@ namespace ml ML_SYS(FileLogs)->log(LEVEL_DEBUG, "hello triggered"); } + ML_SYS(Scenes)->update(dt); + ML_SYS(Graphics)->clear(4, 139, 154); + ML_SYS(Scenes)->draw(*ML_SYS(Graphics)); ML_SYS(Graphics)->draw(sprite); ML_SYS(Graphics)->update(); + + auto elapsed = std::chrono::steady_clock::now() - now; + dt = std::chrono::duration_cast(elapsed) + .count() / 1000000.0f; } } diff --git a/src/Game.hpp b/src/Game.hpp index 4155215..5782ff0 100644 --- a/src/Game.hpp +++ b/src/Game.hpp @@ -7,7 +7,8 @@ namespace ml { /** - * Manage game state. + * Manage game state and scenes. + * @see Scene **/ class Game { diff --git a/src/commons.hpp b/src/commons.hpp index 4404084..444c41b 100644 --- a/src/commons.hpp +++ b/src/commons.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #define ML_ASSET(NAME) \ (std::filesystem::path(ML_SHARE_DIR) / "assets" / NAME) diff --git a/src/main.cpp b/src/main.cpp index 74c9e8e..5ff4e58 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,11 +5,7 @@ // Services #include "Services.hpp" -#include "logs/FileLogs.hpp" -#include "events/Events.hpp" -#include "gfx/Graphics.hpp" -#include "res/Resources.hpp" -#include "inputs/Inputs.hpp" +#include "ml.hpp" #include "Manifest.hpp" #include "Game.hpp" @@ -18,12 +14,11 @@ int main(int, char**) { ML->add (std::filesystem::temp_directory_path() / "mornelune.log"); - ML->add(); - ML->add(); ML->add("Mornelune", 1024, 768); ML->add(); + ML->add(); ML->init(); ml::Manifest man; diff --git a/src/ml.hpp b/src/ml.hpp index 62d8c1b..a3cda01 100644 --- a/src/ml.hpp +++ b/src/ml.hpp @@ -5,5 +5,6 @@ #include "inputs/Inputs.hpp" #include "gfx/Graphics.hpp" #include "events/Events.hpp" +#include "scenes/Scenes.hpp" #endif diff --git a/src/scenes/Scene.cpp b/src/scenes/Scene.cpp new file mode 100644 index 0000000..9af15d5 --- /dev/null +++ b/src/scenes/Scene.cpp @@ -0,0 +1,12 @@ +#include "Scene.hpp" + +namespace ml +{ + /*explicit*/ Scene::Scene() + { + } + + /*virtual*/ Scene::~Scene() + { + } +} diff --git a/src/scenes/Scene.hpp b/src/scenes/Scene.hpp new file mode 100644 index 0000000..d299972 --- /dev/null +++ b/src/scenes/Scene.hpp @@ -0,0 +1,22 @@ +#ifndef ml_SCENE_HPP +#define ml_SCENE_HPP + +#include "../commons.hpp" +#include "../gfx/Graphics.hpp" + +namespace ml +{ + class Scene + { + public: + explicit Scene(); + virtual ~Scene(); + + virtual void draw(Graphics&) {} + virtual void update(float) {} + + private: + }; +} + +#endif diff --git a/src/scenes/Scenes.cpp b/src/scenes/Scenes.cpp new file mode 100644 index 0000000..21ccd32 --- /dev/null +++ b/src/scenes/Scenes.cpp @@ -0,0 +1,46 @@ +//#include "../logs/FileLogs.hpp" +//#include "../Services.hpp" +#include "../ml.hpp" +#include "Scenes.hpp" + +namespace ml +{ + /*explicit*/ Scenes::Scenes() + { + } + + /*virtual*/ Scenes::~Scenes() + { + } + + void Scenes::draw(Graphics& gfx) + { + for (auto& entry: m_scenes) + { + entry.second->draw(gfx); + } + } + + void Scenes::update(float dt) + { + for (auto& scene: m_add_queue) + { + m_scenes.insert({scene.first, std::move(scene.second)}); + } + + m_add_queue.clear(); + + for (auto& scene: m_remove_queue) + { + m_scenes.erase(m_scenes.find(scene)); + } + + m_remove_queue.clear(); + + for (auto& entry: m_scenes) + { + entry.second->update(dt); + } + } + +} diff --git a/src/scenes/Scenes.hpp b/src/scenes/Scenes.hpp new file mode 100644 index 0000000..61fd2ad --- /dev/null +++ b/src/scenes/Scenes.hpp @@ -0,0 +1,44 @@ +#ifndef ml_SCENES_HPP +#define ml_SCENES_HPP + +#include "../commons.hpp" +#include "../gfx/Graphics.hpp" +#include "../logs/FileLogs.hpp" +#include "../Services.hpp" +#include "Scene.hpp" + +namespace ml +{ + class Scenes: public Service + { + public: + explicit Scenes(); + virtual ~Scenes(); + + void draw(Graphics& gfx); + void update(float dt); + + template + void queue_add(std::string const& name, Args... args); + + private: + std::unordered_map> m_scenes; + + std::vector>> m_add_queue; + + std::vector m_remove_queue; + }; + + template + void Scenes::queue_add(std::string const& name, Args... args) + { + ML_SYS(FileLogs)->log(LEVEL_DEBUG, "add scene '" + + name + "'"); + + m_scenes.insert({name, std::make_unique(args...)}); + } +} + +#endif diff --git a/src/scenes/World.cpp b/src/scenes/World.cpp new file mode 100644 index 0000000..71a53ea --- /dev/null +++ b/src/scenes/World.cpp @@ -0,0 +1,22 @@ +#include "World.hpp" +#include "../ml.hpp" + +namespace ml +{ + /*explicit*/ World::World() + { + } + + /*virtual*/ World::~World() + { + } + + void World::update(float) /*override*/ + { + } + + void World::draw(Graphics& gfx) /*override*/ + { + gfx.clear(0, 0, 0); + } +} diff --git a/src/scenes/World.hpp b/src/scenes/World.hpp new file mode 100644 index 0000000..13ec161 --- /dev/null +++ b/src/scenes/World.hpp @@ -0,0 +1,22 @@ +#ifndef ml_WORLD_HPP +#define ml_WORLD_HPP + +#include "../commons.hpp" +#include "Scene.hpp" + +namespace ml +{ + class World: public Scene + { + public: + explicit World(); + virtual ~World(); + + void update(float dt) override; + void draw(Graphics& gfx) override; + + private: + }; +} + +#endif