#ifndef GAME_H_E6F1396E #define GAME_H_E6F1396E #include #include #include #include #include #include "sprite.h" #include "map.h" #include "consts.h" #include "system.h" #include "mixer.h" class Game { public: Mixer& getMixer() { return mixer_; } bool shouldQuit() const { return shouldQuit_; } void quit() { shouldQuit_ = true; } template void emplaceSystem() { systems_.push_back(std::make_unique(*this)); systemByKey_[T::Key] = systems_.back().get(); } template T& getSystem() { return *dynamic_cast(systemByKey_.at(T::Key)); } auto systems() { return systems_ | ranges::views::transform([&] (std::unique_ptr& systemPtr) -> System& { return *systemPtr; }); } int emplaceSprite(); const Sprite& getSprite(int id) const { return sprites_.at(id); } Sprite& getSprite(int id) { return sprites_.at(id); } const std::vector& getSprites() { return spriteIds_; } auto spriteView() const { return ranges::views::transform([&] (int id) -> const Sprite& { return sprites_.at(id); }); } auto spriteView() { return ranges::views::transform([&] (int id) -> Sprite& { return sprites_.at(id); }); } void setMap(std::unique_ptr map) { map_ = std::move(map); } const Map& getMap() const { return *map_; } private: Mixer mixer_; bool shouldQuit_ = false; std::list> systems_; std::map systemByKey_; std::vector spriteIds_; std::vector sprites_; std::unique_ptr map_; }; #endif /* end of include guard: GAME_H_E6F1396E */