summary refs log tree commit diff stats
path: root/src/transform_system.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2021-02-06 13:03:01 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-02-06 13:03:01 -0500
commit1abc8894c2378596542e5772cd7594492eeecb27 (patch)
treec905dc3c96ff7b1d64aaf3212214f0731305bf82 /src/transform_system.cpp
parent4526d347961f7a5df110ef94bd38b80008e3110d (diff)
downloadtanetane-1abc8894c2378596542e5772cd7594492eeecb27.tar.gz
tanetane-1abc8894c2378596542e5772cd7594492eeecb27.tar.bz2
tanetane-1abc8894c2378596542e5772cd7594492eeecb27.zip
Added collision with other sprites
Diffstat (limited to 'src/transform_system.cpp')
-rw-r--r--src/transform_system.cpp130
1 files changed, 101 insertions, 29 deletions
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 }