✨ scene system and empty world scene.
parent
6c10e63d45
commit
382cf5d006
|
@ -30,6 +30,11 @@ executable(
|
||||||
'src/Sprite.cpp',
|
'src/Sprite.cpp',
|
||||||
'src/Manifest.cpp',
|
'src/Manifest.cpp',
|
||||||
|
|
||||||
|
# Scenes
|
||||||
|
'src/scenes/Scenes.cpp',
|
||||||
|
'src/scenes/Scene.cpp',
|
||||||
|
'src/scenes/World.cpp',
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
'src/logs/Logs.cpp',
|
'src/logs/Logs.cpp',
|
||||||
'src/logs/FileLogs.cpp',
|
'src/logs/FileLogs.cpp',
|
||||||
|
|
19
src/Game.cpp
19
src/Game.cpp
|
@ -1,11 +1,8 @@
|
||||||
#include "Game.hpp"
|
#include "Game.hpp"
|
||||||
#include "logs/FileLogs.hpp"
|
#include "ml.hpp"
|
||||||
#include "events/Events.hpp"
|
|
||||||
#include "logs/Logs.hpp"
|
|
||||||
#include "gfx/Graphics.hpp"
|
|
||||||
#include "inputs/Inputs.hpp"
|
|
||||||
|
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
|
#include "scenes/World.hpp"
|
||||||
|
|
||||||
namespace ml
|
namespace ml
|
||||||
{
|
{
|
||||||
|
@ -20,6 +17,7 @@ namespace ml
|
||||||
void Game::start()
|
void Game::start()
|
||||||
{
|
{
|
||||||
ML_SYS(FileLogs)->log(LEVEL_INFO, "game started");
|
ML_SYS(FileLogs)->log(LEVEL_INFO, "game started");
|
||||||
|
ML_SYS(Scenes)->queue_add<World>("world");
|
||||||
|
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
|
@ -28,8 +26,12 @@ namespace ml
|
||||||
Sprite sprite {256.0f, 256.0f, 128.0f, 128.0f};
|
Sprite sprite {256.0f, 256.0f, 128.0f, 128.0f};
|
||||||
sprite.set_texture("demo");
|
sprite.set_texture("demo");
|
||||||
|
|
||||||
|
float dt = 0.0f;
|
||||||
|
|
||||||
while (m_running)
|
while (m_running)
|
||||||
{
|
{
|
||||||
|
auto now = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
if (event.type == SDL_QUIT)
|
if (event.type == SDL_QUIT)
|
||||||
|
@ -43,9 +45,16 @@ namespace ml
|
||||||
ML_SYS(FileLogs)->log(LEVEL_DEBUG, "hello triggered");
|
ML_SYS(FileLogs)->log(LEVEL_DEBUG, "hello triggered");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ML_SYS(Scenes)->update(dt);
|
||||||
|
|
||||||
ML_SYS(Graphics)->clear(4, 139, 154);
|
ML_SYS(Graphics)->clear(4, 139, 154);
|
||||||
|
ML_SYS(Scenes)->draw(*ML_SYS(Graphics));
|
||||||
ML_SYS(Graphics)->draw(sprite);
|
ML_SYS(Graphics)->draw(sprite);
|
||||||
ML_SYS(Graphics)->update();
|
ML_SYS(Graphics)->update();
|
||||||
|
|
||||||
|
auto elapsed = std::chrono::steady_clock::now() - now;
|
||||||
|
dt = std::chrono::duration_cast<std::chrono::microseconds>(elapsed)
|
||||||
|
.count() / 1000000.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
namespace ml
|
namespace ml
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Manage game state.
|
* Manage game state and scenes.
|
||||||
|
* @see Scene
|
||||||
**/
|
**/
|
||||||
class Game
|
class Game
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#define ML_ASSET(NAME) \
|
#define ML_ASSET(NAME) \
|
||||||
(std::filesystem::path(ML_SHARE_DIR) / "assets" / NAME)
|
(std::filesystem::path(ML_SHARE_DIR) / "assets" / NAME)
|
||||||
|
|
|
@ -5,11 +5,7 @@
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
#include "Services.hpp"
|
#include "Services.hpp"
|
||||||
#include "logs/FileLogs.hpp"
|
#include "ml.hpp"
|
||||||
#include "events/Events.hpp"
|
|
||||||
#include "gfx/Graphics.hpp"
|
|
||||||
#include "res/Resources.hpp"
|
|
||||||
#include "inputs/Inputs.hpp"
|
|
||||||
|
|
||||||
#include "Manifest.hpp"
|
#include "Manifest.hpp"
|
||||||
#include "Game.hpp"
|
#include "Game.hpp"
|
||||||
|
@ -18,12 +14,11 @@ int main(int, char**)
|
||||||
{
|
{
|
||||||
ML->add<ml::FileLogs>
|
ML->add<ml::FileLogs>
|
||||||
(std::filesystem::temp_directory_path() / "mornelune.log");
|
(std::filesystem::temp_directory_path() / "mornelune.log");
|
||||||
|
|
||||||
ML->add<ml::Resources>();
|
ML->add<ml::Resources>();
|
||||||
|
|
||||||
ML->add<ml::Events>();
|
ML->add<ml::Events>();
|
||||||
ML->add<ml::Graphics>("Mornelune", 1024, 768);
|
ML->add<ml::Graphics>("Mornelune", 1024, 768);
|
||||||
ML->add<ml::Inputs>();
|
ML->add<ml::Inputs>();
|
||||||
|
ML->add<ml::Scenes>();
|
||||||
ML->init();
|
ML->init();
|
||||||
|
|
||||||
ml::Manifest man;
|
ml::Manifest man;
|
||||||
|
|
|
@ -5,5 +5,6 @@
|
||||||
#include "inputs/Inputs.hpp"
|
#include "inputs/Inputs.hpp"
|
||||||
#include "gfx/Graphics.hpp"
|
#include "gfx/Graphics.hpp"
|
||||||
#include "events/Events.hpp"
|
#include "events/Events.hpp"
|
||||||
|
#include "scenes/Scenes.hpp"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include "Scene.hpp"
|
||||||
|
|
||||||
|
namespace ml
|
||||||
|
{
|
||||||
|
/*explicit*/ Scene::Scene()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*virtual*/ Scene::~Scene()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
Reference in New Issue