X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Fstage.h;h=283dc81c0747776875cfed9d0048aa720b1bfbba;hb=f377d216dfc44e36da3697557f38dfedcbec45d1;hp=d7793e22f60ec21fd52acab1b8af9aafbe2f4d94;hpb=c3ac50ad3e79b26d1d99bd222a7e43adb86c2c1e;p=libs%2Fgame.git diff --git a/source/game/stage.h b/source/game/stage.h index d7793e2..283dc81 100644 --- a/source/game/stage.h +++ b/source/game/stage.h @@ -2,14 +2,17 @@ #define MSP_GAME_STAGE_H_ #include +#include #include #include "eventbus.h" #include "events.h" #include "eventsource.h" #include "handle.h" +#include "reflection.h" namespace Msp::Game { +class Camera; class Root; class System; @@ -17,21 +20,27 @@ class Stage { public: using EventSource = Game::EventSource; + Events::ComponentCreated, Events::ComponentDestroyed, Events::CameraChanged>; private: + Reflection::Reflector &reflector; + DataFile::Collection &resources; PoolPool pools; EventBus event_bus; EventSource event_source; + EventObserver event_observer; /* Use unique_ptr because there's only one root per stage so it's pointless to put it in a pool. */ std::unique_ptr root; std::vector> systems; + Handle active_camera; public: - Stage(); + Stage(Reflection::Reflector &, DataFile::Collection &); ~Stage(); + Reflection::Reflector &get_reflector() const { return reflector; } + DataFile::Collection &get_resources() const { return resources; } PoolPool &get_pools() { return pools; } EventBus &get_event_bus() { return event_bus; } EventSource &get_event_source() { return event_source; } @@ -43,11 +52,20 @@ public: template T &add_system(Args &&...); + void remove_system(System &); const std::vector> &get_systems() const { return systems; } template T *get_system() const; + void set_active_camera(Handle); + Handle get_active_camera() const { return active_camera; } + + void synthesize_initial_events(EventObserver &); +private: + void synthesize_initial_events(Handle, EventObserver &); + +public: void tick(Time::TimeDelta); };