summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp1
-rw-r--r--src/transform_system.cpp130
-rw-r--r--src/transform_system.h3
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;
14struct AxisResult { 14struct AxisResult {
15 Direction dir; 15 Direction dir;
16 bool blocked = false; 16 bool blocked = false;
17 int colliderSprite = -1;
17}; 18};
18 19
19struct CollisionResult { 20struct 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>,