scene system and empty world scene.

main
bog 2023-10-27 12:33:42 +02:00
parent 6c10e63d45
commit 382cf5d006
12 changed files with 193 additions and 13 deletions

View File

@ -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',

View File

@ -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>("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<std::chrono::microseconds>(elapsed)
.count() / 1000000.0f;
}
}

View File

@ -7,7 +7,8 @@
namespace ml
{
/**
* Manage game state.
* Manage game state and scenes.
* @see Scene
**/
class Game
{

View File

@ -13,6 +13,7 @@
#include <iostream>
#include <fstream>
#include <optional>
#include <chrono>
#define ML_ASSET(NAME) \
(std::filesystem::path(ML_SHARE_DIR) / "assets" / NAME)

View File

@ -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<ml::FileLogs>
(std::filesystem::temp_directory_path() / "mornelune.log");
ML->add<ml::Resources>();
ML->add<ml::Events>();
ML->add<ml::Graphics>("Mornelune", 1024, 768);
ML->add<ml::Inputs>();
ML->add<ml::Scenes>();
ML->init();
ml::Manifest man;

View File

@ -5,5 +5,6 @@
#include "inputs/Inputs.hpp"
#include "gfx/Graphics.hpp"
#include "events/Events.hpp"
#include "scenes/Scenes.hpp"
#endif

12
src/scenes/Scene.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "Scene.hpp"
namespace ml
{
/*explicit*/ Scene::Scene()
{
}
/*virtual*/ Scene::~Scene()
{
}
}

22
src/scenes/Scene.hpp Normal file
View File

@ -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

46
src/scenes/Scenes.cpp Normal file
View File

@ -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);
}
}
}

44
src/scenes/Scenes.hpp Normal file
View File

@ -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 <typename T, typename... Args>
void queue_add(std::string const& name, Args... args);
private:
std::unordered_map<std::string,
std::unique_ptr<Scene>> m_scenes;
std::vector<std::pair<std::string,
std::unique_ptr<Scene>>> m_add_queue;
std::vector<std::string> m_remove_queue;
};
template <typename T, typename... Args>
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<T>(args...)});
}
}
#endif

22
src/scenes/World.cpp Normal file
View File

@ -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);
}
}

22
src/scenes/World.hpp Normal file
View File

@ -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