From 1c995f2e6c589df9da28c5534c7128e1da64bb89 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 8 Mar 2021 13:01:05 -0500 Subject: Split collision detection into two phases, horizontal and vertical The whole function should probably be refactored at some point, possibly like therapy5's but that may be too complicated. #14 --- src/transform_system.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/transform_system.cpp') diff --git a/src/transform_system.cpp b/src/transform_system.cpp index 71b3a4f..055f546 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp @@ -57,9 +57,12 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 vec2i mapBounds = map.getMapSize() * map.getTileSize(); + // First check horizontal movement only. + vec2i horizMovement = { newLoc.x(), curLoc.y() }; + vec2i oldColUL = curLoc + sprite.collisionOffset; vec2i oldColDR = oldColUL + sprite.collisionSize; - vec2i newColUL = newLoc + sprite.collisionOffset; + vec2i newColUL = horizMovement + sprite.collisionOffset; vec2i newColDR = newColUL + sprite.collisionSize; vec2i oldTileUL = oldColUL / map.getTileSize(); @@ -154,6 +157,26 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 } } + // For vertical movement, assume that the horizontal movement has already + // taken place (as long as it was not in fact blocked). + vec2i effectiveCurLoc = curLoc; + vec2i vertMovement = newLoc; + if (result.horiz.blocked) { + vertMovement.x() = curLoc.x(); + } else { + effectiveCurLoc.x() = newLoc.x(); + } + + oldColUL = effectiveCurLoc + sprite.collisionOffset; + oldColDR = oldColUL + sprite.collisionSize; + newColUL = vertMovement + sprite.collisionOffset; + newColDR = newColUL + sprite.collisionSize; + + oldTileUL = oldColUL / map.getTileSize(); + newTileUL = newColUL / map.getTileSize(); + oldTileDR = oldColDR / map.getTileSize(); + newTileDR = newColDR / map.getTileSize(); + if (dirHasDir(dir, Direction::down)) { if (newTileDR.y() > oldTileDR.y() && newColDR.y() < mapBounds.h()) { -- cgit 1.4.1