diff options
-rw-r--r-- | src/main.cpp | 1 | ||||
-rw-r--r-- | src/transform_system.cpp | 130 | ||||
-rw-r--r-- | src/transform_system.h | 3 |
3 files changed, 105 insertions, 29 deletions
diff --git a/src/main.cpp b/src/main.cpp index 4d8f52d..8363995 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -49,6 +49,7 @@ void loop(Renderer& renderer) { | |||
49 | 49 | ||
50 | int flintSprite = game.emplaceSprite(); | 50 | int flintSprite = game.emplaceSprite(); |
51 | game.getSystem<TransformSystem>().initSprite(flintSprite, {35*16, 19*16}); | 51 | game.getSystem<TransformSystem>().initSprite(flintSprite, {35*16, 19*16}); |
52 | game.getSystem<TransformSystem>().setUpCollision(flintSprite, {-8, -8}, {12, 8}); | ||
52 | game.getSystem<AnimationSystem>().initSprite(flintSprite, "../res/sprites/flint_anim.txt", renderer); | 53 | game.getSystem<AnimationSystem>().initSprite(flintSprite, "../res/sprites/flint_anim.txt", renderer); |
53 | 54 | ||
54 | game.getSystem<CameraSystem>().setFollowingSprite(lucasSprite); | 55 | game.getSystem<CameraSystem>().setFollowingSprite(lucasSprite); |
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index d6df5fa..3d65acb 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp | |||
@@ -54,50 +54,122 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
54 | vec2i oldTileDR = oldColDR / map.getTileSize(); | 54 | vec2i oldTileDR = oldColDR / map.getTileSize(); |
55 | vec2i newTileDR = newColDR / map.getTileSize(); | 55 | vec2i newTileDR = newColDR / map.getTileSize(); |
56 | 56 | ||
57 | if (dirHasDir(sprite.dir, Direction::right) && | 57 | if (dirHasDir(sprite.dir, Direction::right)) { |
58 | newTileDR.x() > oldTileDR.x()) { | 58 | if (newTileDR.x() > oldTileDR.x()) { |
59 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { | 59 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
60 | if (map.isBlocked(newTileDR.x(), y)) { | 60 | if (map.isBlocked(newTileDR.x(), y)) { |
61 | result.horiz.blocked = true; | 61 | result.horiz.blocked = true; |
62 | result.horiz.dir = Direction::right; | 62 | result.horiz.dir = Direction::right; |
63 | 63 | ||
64 | break; | 64 | break; |
65 | } | ||
66 | } | ||
67 | } | ||
68 | |||
69 | if (!result.horiz.blocked) { | ||
70 | auto it = rightCollidables_.lower_bound({oldColDR.x(), INT_MAX}); | ||
71 | for (; | ||
72 | (it != std::end(rightCollidables_) && | ||
73 | std::get<0>(it->first) <= newColDR.x()); | ||
74 | it++) { | ||
75 | if (newColDR.y() >= it->second.lower && | ||
76 | newColUL.y() <= it->second.upper) { | ||
77 | result.horiz.blocked = true; | ||
78 | result.horiz.dir = Direction::right; | ||
79 | result.horiz.colliderSprite = std::get<1>(it->first); | ||
80 | |||
81 | break; | ||
82 | } | ||
65 | } | 83 | } |
66 | } | 84 | } |
67 | } | 85 | } |
68 | 86 | ||
69 | if (dirHasDir(sprite.dir, Direction::left) && | 87 | if (dirHasDir(sprite.dir, Direction::left)) { |
70 | newTileUL.x() < oldTileUL.x()) { | 88 | if (newTileUL.x() < oldTileUL.x()) { |
71 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { | 89 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
72 | if (map.isBlocked(newTileUL.x(), y)) { | 90 | if (map.isBlocked(newTileUL.x(), y)) { |
73 | result.horiz.blocked = true; | 91 | result.horiz.blocked = true; |
74 | result.horiz.dir = Direction::left; | 92 | result.horiz.dir = Direction::left; |
93 | |||
94 | break; | ||
95 | } | ||
96 | } | ||
97 | } | ||
75 | 98 | ||
76 | break; | 99 | if (!result.horiz.blocked) { |
100 | auto it = leftCollidables_.lower_bound({oldColUL.x(), 0}); | ||
101 | for (; | ||
102 | (it != std::end(leftCollidables_) && | ||
103 | std::get<0>(it->first) >= newColUL.x()); | ||
104 | it++) { | ||
105 | if (newColDR.y() >= it->second.lower && | ||
106 | newColUL.y() <= it->second.upper) { | ||
107 | result.horiz.blocked = true; | ||
108 | result.horiz.dir = Direction::left; | ||
109 | result.horiz.colliderSprite = std::get<1>(it->first); | ||
110 | |||
111 | break; | ||
112 | } | ||
77 | } | 113 | } |
78 | } | 114 | } |
79 | } | 115 | } |
80 | 116 | ||
81 | if (dirHasDir(sprite.dir, Direction::down) && | 117 | if (dirHasDir(sprite.dir, Direction::down)) { |
82 | newTileDR.y() > oldTileDR.y()) { | 118 | if (newTileDR.y() > oldTileDR.y()) { |
83 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { | 119 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
84 | if (map.isBlocked(x, newTileDR.y())) { | 120 | if (map.isBlocked(x, newTileDR.y())) { |
85 | result.vert.blocked = true; | 121 | result.vert.blocked = true; |
86 | result.vert.dir = Direction::down; | 122 | result.vert.dir = Direction::down; |
87 | 123 | ||
88 | break; | 124 | break; |
125 | } | ||
126 | } | ||
127 | } | ||
128 | |||
129 | if (!result.vert.blocked) { | ||
130 | auto it = downCollidables_.lower_bound({oldColDR.y(), INT_MAX}); | ||
131 | for (; | ||
132 | (it != std::end(downCollidables_) && | ||
133 | std::get<0>(it->first) <= newColDR.y()); | ||
134 | it++) { | ||
135 | if (newColDR.x() >= it->second.lower && | ||
136 | newColUL.x() <= it->second.upper) { | ||
137 | result.vert.blocked = true; | ||
138 | result.vert.dir = Direction::down; | ||
139 | result.vert.colliderSprite = std::get<1>(it->first); | ||
140 | |||
141 | break; | ||
142 | } | ||
89 | } | 143 | } |
90 | } | 144 | } |
91 | } | 145 | } |
92 | 146 | ||
93 | if (dirHasDir(sprite.dir, Direction::up) && | 147 | if (dirHasDir(sprite.dir, Direction::up)) { |
94 | newTileUL.y() < oldTileUL.y()) { | 148 | if (newTileUL.y() < oldTileUL.y()) { |
95 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { | 149 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
96 | if (map.isBlocked(x, newTileUL.y())) { | 150 | if (map.isBlocked(x, newTileUL.y())) { |
97 | result.vert.blocked = true; | 151 | result.vert.blocked = true; |
98 | result.vert.dir = Direction::up; | 152 | result.vert.dir = Direction::up; |
153 | |||
154 | break; | ||
155 | } | ||
156 | } | ||
157 | } | ||
99 | 158 | ||
100 | break; | 159 | if (!result.vert.blocked) { |
160 | auto it = upCollidables_.lower_bound({oldColUL.y(), 0}); | ||
161 | for (; | ||
162 | (it != std::end(upCollidables_) && | ||
163 | std::get<0>(it->first) >= newColUL.y()); | ||
164 | it++) { | ||
165 | if (newColDR.x() >= it->second.lower && | ||
166 | newColUL.x() <= it->second.upper) { | ||
167 | result.vert.blocked = true; | ||
168 | result.vert.dir = Direction::up; | ||
169 | result.vert.colliderSprite = std::get<1>(it->first); | ||
170 | |||
171 | break; | ||
172 | } | ||
101 | } | 173 | } |
102 | } | 174 | } |
103 | } | 175 | } |
diff --git a/src/transform_system.h b/src/transform_system.h index 1ad661c..a7294ce 100644 --- a/src/transform_system.h +++ b/src/transform_system.h | |||
@@ -14,6 +14,7 @@ class Game; | |||
14 | struct AxisResult { | 14 | struct AxisResult { |
15 | Direction dir; | 15 | Direction dir; |
16 | bool blocked = false; | 16 | bool blocked = false; |
17 | int colliderSprite = -1; | ||
17 | }; | 18 | }; |
18 | 19 | ||
19 | struct CollisionResult { | 20 | struct CollisionResult { |
@@ -54,6 +55,8 @@ private: | |||
54 | Collidable(int lower, int upper) : lower(lower), upper(upper) {} | 55 | Collidable(int lower, int upper) : lower(lower), upper(upper) {} |
55 | }; | 56 | }; |
56 | 57 | ||
58 | // The way these work is that the key is (axis position, entity ID). The | ||
59 | // entity ID being there makes the mapping unique and makes removal easy. | ||
57 | using asc_collidables_type = | 60 | using asc_collidables_type = |
58 | std::map< | 61 | std::map< |
59 | std::tuple<int, int>, | 62 | std::tuple<int, int>, |