diff options
-rw-r--r-- | src/entity.h | 20 | ||||
-rw-r--r-- | src/enums.h | 19 | ||||
-rw-r--r-- | src/main.cpp | 13 | ||||
-rw-r--r-- | src/simulation.cpp | 33 | ||||
-rw-r--r-- | src/tileset.h | 4 |
5 files changed, 59 insertions, 30 deletions
diff --git a/src/entity.h b/src/entity.h index 0ff31e1..b606b43 100644 --- a/src/entity.h +++ b/src/entity.h | |||
@@ -1,21 +1,9 @@ | |||
1 | #ifndef ENTITY_H_0D6CB29A | 1 | #ifndef ENTITY_H_0D6CB29A |
2 | #define ENTITY_H_0D6CB29A | 2 | #define ENTITY_H_0D6CB29A |
3 | 3 | ||
4 | #include <set> | ||
4 | #include "vector.h" | 5 | #include "vector.h" |
5 | 6 | #include "enums.h" | |
6 | enum class ColliderType { | ||
7 | player, | ||
8 | train, | ||
9 | other | ||
10 | }; | ||
11 | |||
12 | enum class Direction { | ||
13 | none, | ||
14 | left, | ||
15 | right, | ||
16 | up, | ||
17 | down | ||
18 | }; | ||
19 | 7 | ||
20 | class Entity { | 8 | class Entity { |
21 | public: | 9 | public: |
@@ -39,9 +27,7 @@ public: | |||
39 | 27 | ||
40 | // Collision | 28 | // Collision |
41 | ColliderType colliderType = ColliderType::other; | 29 | ColliderType colliderType = ColliderType::other; |
42 | 30 | std::set<ColliderType> canBePushedBy; | |
43 | bool playerCanPush = false; | ||
44 | bool trainCanPush = false; | ||
45 | 31 | ||
46 | // Temp | 32 | // Temp |
47 | int colorVal = 25; | 33 | int colorVal = 25; |
diff --git a/src/enums.h b/src/enums.h new file mode 100644 index 0000000..9821da1 --- /dev/null +++ b/src/enums.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef ENUMS_H_CD0A75E4 | ||
2 | #define ENUMS_H_CD0A75E4 | ||
3 | |||
4 | enum class ColliderType { | ||
5 | player, | ||
6 | train, | ||
7 | crate, | ||
8 | other | ||
9 | }; | ||
10 | |||
11 | enum class Direction { | ||
12 | none, | ||
13 | left, | ||
14 | right, | ||
15 | up, | ||
16 | down | ||
17 | }; | ||
18 | |||
19 | #endif /* end of include guard: ENUMS_H_CD0A75E4 */ | ||
diff --git a/src/main.cpp b/src/main.cpp index c041cf8..c77d25b 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -26,9 +26,20 @@ int main(int, char**) | |||
26 | Entity& crate = sim.getEntity(crateId); | 26 | Entity& crate = sim.getEntity(crateId); |
27 | crate.size = TILE_SIZE; | 27 | crate.size = TILE_SIZE; |
28 | crate.speed = 4.0; | 28 | crate.speed = 4.0; |
29 | crate.playerCanPush = true; | 29 | crate.colliderType = ColliderType::crate; |
30 | crate.canBePushedBy.insert(ColliderType::player); | ||
31 | crate.canBePushedBy.insert(ColliderType::crate); | ||
30 | sim.setGridPos(crateId, vec2s { 4, 5 } ); | 32 | sim.setGridPos(crateId, vec2s { 4, 5 } ); |
31 | 33 | ||
34 | Simulation::id_type crateId2 = sim.emplaceEntity(); | ||
35 | Entity& crate2 = sim.getEntity(crateId2); | ||
36 | crate2.size = TILE_SIZE; | ||
37 | crate2.speed = 4.0; | ||
38 | crate2.colliderType = ColliderType::crate; | ||
39 | crate2.canBePushedBy.insert(ColliderType::player); | ||
40 | crate2.canBePushedBy.insert(ColliderType::crate); | ||
41 | sim.setGridPos(crateId2, vec2s { 6, 7 } ); | ||
42 | |||
32 | bool quit = false; | 43 | bool quit = false; |
33 | 44 | ||
34 | SDL_Event e; | 45 | SDL_Event e; |
diff --git a/src/simulation.cpp b/src/simulation.cpp index ca6ca3d..912f7f0 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp | |||
@@ -42,7 +42,7 @@ void Simulation::tick( | |||
42 | { | 42 | { |
43 | Entity& block = entities_.at(blockId); | 43 | Entity& block = entities_.at(blockId); |
44 | 44 | ||
45 | if (!block.moving && block.playerCanPush) | 45 | if (!block.moving && block.canBePushedBy.count(ColliderType::player)) |
46 | { | 46 | { |
47 | moveEntityOnGrid(blockId, lookDir); | 47 | moveEntityOnGrid(blockId, lookDir); |
48 | } | 48 | } |
@@ -169,6 +169,8 @@ bool Simulation::moveEntityOnGrid( | |||
169 | Direction moveDir, | 169 | Direction moveDir, |
170 | bool validate) | 170 | bool validate) |
171 | { | 171 | { |
172 | bool actuallyMove = true; | ||
173 | |||
172 | Entity& entity = entities_.at(id); | 174 | Entity& entity = entities_.at(id); |
173 | 175 | ||
174 | vec2s shouldMoveTo = posInDir(entity.gridPos, moveDir); | 176 | vec2s shouldMoveTo = posInDir(entity.gridPos, moveDir); |
@@ -216,18 +218,20 @@ bool Simulation::moveEntityOnGrid( | |||
216 | } | 218 | } |
217 | } | 219 | } |
218 | 220 | ||
219 | if (entity.colliderType == ColliderType::player) | 221 | if (!level_.getTileset().canEntityMoveTo( |
222 | entity.colliderType, | ||
223 | level_.at(shouldMoveTo))) | ||
220 | { | 224 | { |
221 | if (!level_.getTileset().canPlayerMoveTo(level_.at(shouldMoveTo))) | 225 | return false; |
222 | { | 226 | } |
223 | return false; | ||
224 | } | ||
225 | 227 | ||
226 | for (id_type blockId : getGridEntities(shouldMoveTo)) | 228 | for (id_type blockId : getGridEntities(shouldMoveTo)) |
227 | { | 229 | { |
228 | Entity& block = entities_.at(blockId); | 230 | Entity& block = entities_.at(blockId); |
229 | 231 | ||
230 | if (block.moving || !block.playerCanPush) | 232 | if (!block.moving) |
233 | { | ||
234 | if (!block.canBePushedBy.count(entity.colliderType)) | ||
231 | { | 235 | { |
232 | return false; | 236 | return false; |
233 | } | 237 | } |
@@ -238,13 +242,20 @@ bool Simulation::moveEntityOnGrid( | |||
238 | } | 242 | } |
239 | } | 243 | } |
240 | 244 | ||
245 | double entityTimeLeft = 1.0 / entity.speed; | ||
246 | double blockTimeLeft = (1.0 - block.movementTween) / block.speed; | ||
247 | |||
248 | if (entityTimeLeft < blockTimeLeft) | ||
249 | { | ||
250 | actuallyMove = false; | ||
251 | } | ||
241 | } | 252 | } |
242 | 253 | ||
243 | 254 | ||
244 | 255 | ||
245 | 256 | ||
246 | 257 | ||
247 | if (!validate) | 258 | if (!validate && actuallyMove) |
248 | { | 259 | { |
249 | entity.moving = true; | 260 | entity.moving = true; |
250 | entity.destPos = shouldMoveTo; | 261 | entity.destPos = shouldMoveTo; |
diff --git a/src/tileset.h b/src/tileset.h index 610a710..8a565bc 100644 --- a/src/tileset.h +++ b/src/tileset.h | |||
@@ -1,10 +1,12 @@ | |||
1 | #ifndef TILESET_H_B89AE7A1 | 1 | #ifndef TILESET_H_B89AE7A1 |
2 | #define TILESET_H_B89AE7A1 | 2 | #define TILESET_H_B89AE7A1 |
3 | 3 | ||
4 | #include "enums.h" | ||
5 | |||
4 | class Tileset { | 6 | class Tileset { |
5 | public: | 7 | public: |
6 | 8 | ||
7 | bool canPlayerMoveTo(size_t tile) const | 9 | bool canEntityMoveTo(ColliderType collider, size_t tile) const |
8 | { | 10 | { |
9 | return true; | 11 | return true; |
10 | } | 12 | } |