diff options
Diffstat (limited to 'src/game.h')
-rw-r--r-- | src/game.h | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/src/game.h b/src/game.h index 189cabb..f89c707 100644 --- a/src/game.h +++ b/src/game.h | |||
@@ -1,14 +1,15 @@ | |||
1 | #ifndef GAME_H_E6F1396E | 1 | #ifndef GAME_H_E6F1396E |
2 | #define GAME_H_E6F1396E | 2 | #define GAME_H_E6F1396E |
3 | 3 | ||
4 | #include <set> | 4 | #include <list> |
5 | #include <range/v3/all.hpp> | 5 | #include <range/v3/all.hpp> |
6 | #include <vector> | 6 | #include <vector> |
7 | #include <memory> | 7 | #include <memory> |
8 | #include <map> | ||
8 | #include "sprite.h" | 9 | #include "sprite.h" |
9 | #include "map.h" | 10 | #include "map.h" |
10 | #include "consts.h" | 11 | #include "consts.h" |
11 | #include "transform_system.h" | 12 | #include "system.h" |
12 | 13 | ||
13 | struct Input { | 14 | struct Input { |
14 | bool left = false; | 15 | bool left = false; |
@@ -20,7 +21,22 @@ struct Input { | |||
20 | class Game { | 21 | class Game { |
21 | public: | 22 | public: |
22 | 23 | ||
23 | Game() : transform_(*this) {} | 24 | template <typename T> |
25 | void emplaceSystem() { | ||
26 | systems_.push_back(std::make_unique<T>(*this)); | ||
27 | systemByKey_[T::Key] = systems_.back().get(); | ||
28 | } | ||
29 | |||
30 | template <typename T> | ||
31 | T& getSystem() { | ||
32 | return *dynamic_cast<T*>(systemByKey_.at(T::Key)); | ||
33 | } | ||
34 | |||
35 | auto systems() { | ||
36 | return systems_ | ranges::views::transform([&] (std::unique_ptr<System>& systemPtr) -> System& { | ||
37 | return *systemPtr; | ||
38 | }); | ||
39 | } | ||
24 | 40 | ||
25 | int addSprite(Sprite sprite); | 41 | int addSprite(Sprite sprite); |
26 | 42 | ||
@@ -42,9 +58,6 @@ public: | |||
42 | }); | 58 | }); |
43 | } | 59 | } |
44 | 60 | ||
45 | TransformSystem& getTransformSystem() { return transform_; } | ||
46 | |||
47 | |||
48 | void setSpriteState(int id, std::string state) { | 61 | void setSpriteState(int id, std::string state) { |
49 | sprites_[id].setState(std::move(state)); | 62 | sprites_[id].setState(std::move(state)); |
50 | } | 63 | } |
@@ -63,33 +76,14 @@ public: | |||
63 | 76 | ||
64 | const Map& getMap() const { return *map_; } | 77 | const Map& getMap() const { return *map_; } |
65 | 78 | ||
66 | // Camera | ||
67 | |||
68 | const vec2i& getCameraPosition() const { return cameraPos_; } | ||
69 | |||
70 | const vec2i& getFieldOfView() const { return cameraFov_; } | ||
71 | |||
72 | void setFollowingSprite(int spriteId) { followingSprite_ = spriteId; } | ||
73 | |||
74 | void lockCamera() { cameraLocked_ = true; } | ||
75 | |||
76 | void unlockCamera() { cameraLocked_ = false; } | ||
77 | |||
78 | void tick(); | ||
79 | |||
80 | private: | 79 | private: |
81 | 80 | ||
82 | TransformSystem transform_; | 81 | std::list<std::unique_ptr<System>> systems_; |
82 | std::map<SystemKey, System*> systemByKey_; | ||
83 | 83 | ||
84 | std::vector<int> spriteIds_; | 84 | std::vector<int> spriteIds_; |
85 | std::vector<Sprite> sprites_; | 85 | std::vector<Sprite> sprites_; |
86 | std::unique_ptr<Map> map_; | 86 | std::unique_ptr<Map> map_; |
87 | |||
88 | // Camera | ||
89 | vec2i cameraPos_; | ||
90 | vec2i cameraFov_ { CANVAS_WIDTH, CANVAS_HEIGHT }; | ||
91 | int followingSprite_; | ||
92 | bool cameraLocked_ = true; | ||
93 | }; | 87 | }; |
94 | 88 | ||
95 | #endif /* end of include guard: GAME_H_E6F1396E */ | 89 | #endif /* end of include guard: GAME_H_E6F1396E */ |