summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/entity.h20
-rw-r--r--src/enums.h19
-rw-r--r--src/main.cpp13
-rw-r--r--src/simulation.cpp33
-rw-r--r--src/tileset.h4
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"
6enum class ColliderType {
7 player,
8 train,
9 other
10};
11
12enum class Direction {
13 none,
14 left,
15 right,
16 up,
17 down
18};
19 7
20class Entity { 8class Entity {
21public: 9public:
@@ -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
4enum class ColliderType {
5 player,
6 train,
7 crate,
8 other
9};
10
11enum 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
4class Tileset { 6class Tileset {
5public: 7public:
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 }