|
@@ -62,82 +62,80 @@ List<CollisionBox> World::getBoxes(const CollisionBox& box) const {
|
|
|
void World::tick() {
|
|
|
for(Entity* e : entities) {
|
|
|
e->tick();
|
|
|
- if(e->skip) {
|
|
|
- LOG_DEBUG("skip");
|
|
|
- continue;
|
|
|
- }
|
|
|
+ Vector3 move = limitMove(*e, e->getVelocity());
|
|
|
+ e->move(move);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- Vector3 move = e->getVelocity();
|
|
|
- CollisionBox box = e->getCollisionBox();
|
|
|
- List<CollisionBox> boxes = getBoxes(box.expand(move));
|
|
|
- if(boxes.getLength() == 0) {
|
|
|
- e->move(move);
|
|
|
- continue;
|
|
|
- }
|
|
|
- Vector3 realMove;
|
|
|
+Vector3 World::limitMove(const Entity& e, Vector3 move) const {
|
|
|
+ CollisionBox box = e.getCollisionBox();
|
|
|
+ List<CollisionBox> boxes = getBoxes(box.expand(move));
|
|
|
+ if(boxes.getLength() == 0) {
|
|
|
+ return move;
|
|
|
+ }
|
|
|
+ Vector3 realMove;
|
|
|
|
|
|
- constexpr float step = 0.05f;
|
|
|
- while(move[0] != 0.0f || move[1] != 0.0f || move[2] != 0.0f) {
|
|
|
- Vector3 old = realMove;
|
|
|
- if(move[0] > step) {
|
|
|
- realMove[0] += step;
|
|
|
- move[0] -= step;
|
|
|
- } else if(move[0] < -step) {
|
|
|
- realMove[0] -= step;
|
|
|
- move[0] += step;
|
|
|
- } else if(move[0] != 0.0f) {
|
|
|
- realMove[0] += move[0];
|
|
|
+ constexpr float step = 0.05f;
|
|
|
+ while(move[0] != 0.0f || move[1] != 0.0f || move[2] != 0.0f) {
|
|
|
+ Vector3 old = realMove;
|
|
|
+ if(move[0] > step) {
|
|
|
+ realMove[0] += step;
|
|
|
+ move[0] -= step;
|
|
|
+ } else if(move[0] < -step) {
|
|
|
+ realMove[0] -= step;
|
|
|
+ move[0] += step;
|
|
|
+ } else if(move[0] != 0.0f) {
|
|
|
+ realMove[0] += move[0];
|
|
|
+ move[0] = 0.0f;
|
|
|
+ }
|
|
|
+ CollisionBox moved = box.offset(realMove);
|
|
|
+ for(const CollisionBox& box : boxes) {
|
|
|
+ if(box.collidesWith(moved)) {
|
|
|
move[0] = 0.0f;
|
|
|
+ realMove = old;
|
|
|
+ break;
|
|
|
}
|
|
|
- CollisionBox moved = box.offset(realMove);
|
|
|
- for(const CollisionBox& box : boxes) {
|
|
|
- if(box.collidesWith(moved)) {
|
|
|
- move[0] = 0.0f;
|
|
|
- realMove = old;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- old = realMove;
|
|
|
- if(move[1] > step) {
|
|
|
- realMove[1] += step;
|
|
|
- move[1] -= step;
|
|
|
- } else if(move[1] < -step) {
|
|
|
- realMove[1] -= step;
|
|
|
- move[1] += step;
|
|
|
- } else if(move[1] != 0.0f) {
|
|
|
- realMove[1] += move[1];
|
|
|
+ old = realMove;
|
|
|
+ if(move[1] > step) {
|
|
|
+ realMove[1] += step;
|
|
|
+ move[1] -= step;
|
|
|
+ } else if(move[1] < -step) {
|
|
|
+ realMove[1] -= step;
|
|
|
+ move[1] += step;
|
|
|
+ } else if(move[1] != 0.0f) {
|
|
|
+ realMove[1] += move[1];
|
|
|
+ move[1] = 0.0f;
|
|
|
+ }
|
|
|
+ moved = box.offset(realMove);
|
|
|
+ for(const CollisionBox& box : boxes) {
|
|
|
+ if(box.collidesWith(moved)) {
|
|
|
move[1] = 0.0f;
|
|
|
+ realMove = old;
|
|
|
+ break;
|
|
|
}
|
|
|
- moved = box.offset(realMove);
|
|
|
- for(const CollisionBox& box : boxes) {
|
|
|
- if(box.collidesWith(moved)) {
|
|
|
- move[1] = 0.0f;
|
|
|
- realMove = old;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- old = realMove;
|
|
|
- if(move[2] > step) {
|
|
|
- realMove[2] += step;
|
|
|
- move[2] -= step;
|
|
|
- } else if(move[2] < -step) {
|
|
|
- realMove[2] -= step;
|
|
|
- move[2] += step;
|
|
|
- } else if(move[2] != 0.0f) {
|
|
|
- realMove[2] += move[2];
|
|
|
+ old = realMove;
|
|
|
+ if(move[2] > step) {
|
|
|
+ realMove[2] += step;
|
|
|
+ move[2] -= step;
|
|
|
+ } else if(move[2] < -step) {
|
|
|
+ realMove[2] -= step;
|
|
|
+ move[2] += step;
|
|
|
+ } else if(move[2] != 0.0f) {
|
|
|
+ realMove[2] += move[2];
|
|
|
+ move[2] = 0.0f;
|
|
|
+ }
|
|
|
+ moved = box.offset(realMove);
|
|
|
+ for(const CollisionBox& box : boxes) {
|
|
|
+ if(box.collidesWith(moved)) {
|
|
|
move[2] = 0.0f;
|
|
|
- }
|
|
|
- moved = box.offset(realMove);
|
|
|
- for(const CollisionBox& box : boxes) {
|
|
|
- if(box.collidesWith(moved)) {
|
|
|
- move[2] = 0.0f;
|
|
|
- realMove = old;
|
|
|
- break;
|
|
|
- }
|
|
|
+ realMove = old;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- e->move(realMove);
|
|
|
}
|
|
|
+ return realMove;
|
|
|
}
|