diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-06 12:15:07 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-06 12:15:07 -0500 |
commit | ef17fecfb22ccacbf098f6869ffaf644a1a627d6 (patch) | |
tree | 96e8379a0c351b32812dd23158413a207dbf3d42 /src/transform_system.cpp | |
parent | 478bc11eec70e6127161ff360cd77d6893a81c42 (diff) | |
download | tanetane-ef17fecfb22ccacbf098f6869ffaf644a1a627d6.tar.gz tanetane-ef17fecfb22ccacbf098f6869ffaf644a1a627d6.tar.bz2 tanetane-ef17fecfb22ccacbf098f6869ffaf644a1a627d6.zip |
Added collidable object cache
Diffstat (limited to 'src/transform_system.cpp')
-rw-r--r-- | src/transform_system.cpp | 79 |
1 files changed, 61 insertions, 18 deletions
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index ad7947f..d6df5fa 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp | |||
@@ -8,8 +8,21 @@ void TransformSystem::initSprite(int spriteId, vec2i loc) { | |||
8 | spritesByY_.emplace(loc.y(), spriteId); | 8 | spritesByY_.emplace(loc.y(), spriteId); |
9 | } | 9 | } |
10 | 10 | ||
11 | void TransformSystem::setUpCollision(int spriteId, vec2i offset, vec2i size) { | ||
12 | Sprite& sprite = game_.getSprite(spriteId); | ||
13 | sprite.collidable = true; | ||
14 | sprite.collisionOffset = offset; | ||
15 | sprite.collisionSize = size; | ||
16 | |||
17 | addCollidable(spriteId); | ||
18 | } | ||
19 | |||
11 | void TransformSystem::moveSprite(int spriteId, vec2i newLoc) { | 20 | void TransformSystem::moveSprite(int spriteId, vec2i newLoc) { |
12 | Sprite& sprite = game_.getSprite(spriteId); | 21 | Sprite& sprite = game_.getSprite(spriteId); |
22 | if (sprite.collidable) { | ||
23 | removeCollidable(spriteId); | ||
24 | } | ||
25 | |||
13 | bool changedY = (sprite.loc.y() != newLoc.y()); | 26 | bool changedY = (sprite.loc.y() != newLoc.y()); |
14 | if (changedY) { | 27 | if (changedY) { |
15 | spritesByY_.erase(std::make_tuple(sprite.loc.y(), spriteId)); | 28 | spritesByY_.erase(std::make_tuple(sprite.loc.y(), spriteId)); |
@@ -18,6 +31,9 @@ void TransformSystem::moveSprite(int spriteId, vec2i newLoc) { | |||
18 | if (changedY) { | 31 | if (changedY) { |
19 | spritesByY_.emplace(newLoc.y(), spriteId); | 32 | spritesByY_.emplace(newLoc.y(), spriteId); |
20 | } | 33 | } |
34 | if (sprite.collidable) { | ||
35 | addCollidable(spriteId); | ||
36 | } | ||
21 | } | 37 | } |
22 | 38 | ||
23 | CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Direction dir) { | 39 | CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Direction dir) { |
@@ -28,17 +44,20 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
28 | const Map& map = game_.getMap(); | 44 | const Map& map = game_.getMap(); |
29 | bool blocked = false; | 45 | bool blocked = false; |
30 | 46 | ||
31 | const vec2i UL_COL_BOX = { 8, 8 }; | 47 | vec2i oldColUL = sprite.loc + sprite.collisionOffset; |
32 | const vec2i DR_COL_BOX = { 4, 0 }; | 48 | vec2i oldColDR = oldColUL + sprite.collisionSize; |
33 | vec2i oldColPosUL = (sprite.loc - UL_COL_BOX) / map.getTileSize(); | 49 | vec2i newColUL = newLoc + sprite.collisionOffset; |
34 | vec2i newColPosUL = (newLoc - UL_COL_BOX) / map.getTileSize(); | 50 | vec2i newColDR = newColUL + sprite.collisionSize; |
35 | vec2i oldColPosDR = (sprite.loc + DR_COL_BOX) / map.getTileSize(); | 51 | |
36 | vec2i newColPosDR = (newLoc + DR_COL_BOX) / map.getTileSize(); | 52 | vec2i oldTileUL = oldColUL / map.getTileSize(); |
53 | vec2i newTileUL = newColUL / map.getTileSize(); | ||
54 | vec2i oldTileDR = oldColDR / map.getTileSize(); | ||
55 | vec2i newTileDR = newColDR / map.getTileSize(); | ||
37 | 56 | ||
38 | if (dirHasDir(sprite.dir, Direction::right) && | 57 | if (dirHasDir(sprite.dir, Direction::right) && |
39 | newColPosDR.x() > oldColPosDR.x()) { | 58 | newTileDR.x() > oldTileDR.x()) { |
40 | for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { | 59 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
41 | if (map.isBlocked(newColPosDR.x(), y)) { | 60 | if (map.isBlocked(newTileDR.x(), y)) { |
42 | result.horiz.blocked = true; | 61 | result.horiz.blocked = true; |
43 | result.horiz.dir = Direction::right; | 62 | result.horiz.dir = Direction::right; |
44 | 63 | ||
@@ -48,9 +67,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
48 | } | 67 | } |
49 | 68 | ||
50 | if (dirHasDir(sprite.dir, Direction::left) && | 69 | if (dirHasDir(sprite.dir, Direction::left) && |
51 | newColPosUL.x() < oldColPosUL.x()) { | 70 | newTileUL.x() < oldTileUL.x()) { |
52 | for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { | 71 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
53 | if (map.isBlocked(newColPosUL.x(), y)) { | 72 | if (map.isBlocked(newTileUL.x(), y)) { |
54 | result.horiz.blocked = true; | 73 | result.horiz.blocked = true; |
55 | result.horiz.dir = Direction::left; | 74 | result.horiz.dir = Direction::left; |
56 | 75 | ||
@@ -60,9 +79,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
60 | } | 79 | } |
61 | 80 | ||
62 | if (dirHasDir(sprite.dir, Direction::down) && | 81 | if (dirHasDir(sprite.dir, Direction::down) && |
63 | newColPosDR.y() > oldColPosDR.y()) { | 82 | newTileDR.y() > oldTileDR.y()) { |
64 | for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { | 83 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
65 | if (map.isBlocked(x, newColPosDR.y())) { | 84 | if (map.isBlocked(x, newTileDR.y())) { |
66 | result.vert.blocked = true; | 85 | result.vert.blocked = true; |
67 | result.vert.dir = Direction::down; | 86 | result.vert.dir = Direction::down; |
68 | 87 | ||
@@ -72,9 +91,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
72 | } | 91 | } |
73 | 92 | ||
74 | if (dirHasDir(sprite.dir, Direction::up) && | 93 | if (dirHasDir(sprite.dir, Direction::up) && |
75 | newColPosUL.y() < oldColPosUL.y()) { | 94 | newTileUL.y() < oldTileUL.y()) { |
76 | for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { | 95 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
77 | if (map.isBlocked(x, newColPosUL.y())) { | 96 | if (map.isBlocked(x, newTileUL.y())) { |
78 | result.vert.blocked = true; | 97 | result.vert.blocked = true; |
79 | result.vert.dir = Direction::up; | 98 | result.vert.dir = Direction::up; |
80 | 99 | ||
@@ -85,3 +104,27 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
85 | 104 | ||
86 | return result; | 105 | return result; |
87 | } | 106 | } |
107 | |||
108 | void TransformSystem::addCollidable(int spriteId) { | ||
109 | Sprite& sprite = game_.getSprite(spriteId); | ||
110 | |||
111 | vec2i colUL = sprite.loc + sprite.collisionOffset; | ||
112 | vec2i colDR = colUL + sprite.collisionSize; | ||
113 | |||
114 | leftCollidables_.emplace(std::piecewise_construct, std::tie(colDR.x(), spriteId), std::tie(colUL.y(), colDR.y())); | ||
115 | rightCollidables_.emplace(std::piecewise_construct, std::tie(colUL.x(), spriteId), std::tie(colUL.y(), colDR.y())); | ||
116 | upCollidables_.emplace(std::piecewise_construct, std::tie(colDR.y(), spriteId), std::tie(colUL.x(), colDR.x())); | ||
117 | downCollidables_.emplace(std::piecewise_construct, std::tie(colUL.y(), spriteId), std::tie(colUL.x(), colDR.x())); | ||
118 | } | ||
119 | |||
120 | void TransformSystem::removeCollidable(int spriteId) { | ||
121 | Sprite& sprite = game_.getSprite(spriteId); | ||
122 | |||
123 | vec2i colUL = sprite.loc + sprite.collisionOffset; | ||
124 | vec2i colDR = colUL + sprite.collisionSize; | ||
125 | |||
126 | leftCollidables_.erase({ colDR.x(), spriteId }); | ||
127 | rightCollidables_.erase({ colUL.x(), spriteId }); | ||
128 | upCollidables_.erase({ colDR.y(), spriteId }); | ||
129 | downCollidables_.erase({ colUL.y(), spriteId }); | ||
130 | } | ||