From 361ec6e65525611a2bb6f88c710a7d24f38699b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Mon, 9 Mar 2020 16:20:40 +0100 Subject: [PATCH] Fix collisions --- assets/levelX.gif | Bin 4328 -> 4635 bytes main.c | 10 +++++++--- raycastlib.h | 9 ++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/assets/levelX.gif b/assets/levelX.gif index f0fdc60889c454412ffd553159eab2986b3fa212..f53df080bd768e6e538a40b91739153ae68bb61b 100644 GIT binary patch delta 3439 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 RKasr82YbEPD-!_$06Tn|!*>7x delta 3163 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 BE(8Do diff --git a/main.c b/main.c index fdab1f8..4c7f51d 100755 --- a/main.c +++ b/main.c @@ -1006,7 +1006,7 @@ RCL_Unit SFG_floorHeightAt(int16_t x, int16_t y) SFG_TileDefinition tile = SFG_getMapTile(SFG_currentLevel.levelPointer,x,y,&properties); - uint8_t doorHeight = 0; + RCL_Unit doorHeight = 0; if (properties == SFG_TILE_PROPERTY_DOOR) { @@ -1017,6 +1017,11 @@ RCL_Unit SFG_floorHeightAt(int16_t x, int16_t y) if ((door->coords[0] == x) && (door->coords[1] == y)) { doorHeight = door->state & SFG_DOOR_VERTICAL_POSITION_MASK; + + doorHeight = doorHeight != (0xff & SFG_DOOR_VERTICAL_POSITION_MASK) ? + doorHeight * SFG_DOOR_HEIGHT_STEP : RCL_UNITS_PER_SQUARE; + + break; } } @@ -1032,8 +1037,7 @@ RCL_Unit SFG_floorHeightAt(int16_t x, int16_t y) SFG_game.frameTime - SFG_currentLevel.timeStart); } - return SFG_TILE_FLOOR_HEIGHT(tile) * SFG_WALL_HEIGHT_STEP - - doorHeight * SFG_DOOR_HEIGHT_STEP; + return SFG_TILE_FLOOR_HEIGHT(tile) * SFG_WALL_HEIGHT_STEP - doorHeight; } /** diff --git a/raycastlib.h b/raycastlib.h index 625d665..8c51e79 100644 --- a/raycastlib.h +++ b/raycastlib.h @@ -1755,12 +1755,17 @@ void RCL_moveCameraWithCollision(RCL_Camera *camera, RCL_Vector2D planeOffset, RCL_Unit bottomLimit = -1 * RCL_INFINITY; RCL_Unit topLimit = RCL_INFINITY; + RCL_Unit currCeilHeight = RCL_INFINITY; + if (computeHeight) { bottomLimit = camera->height - RCL_CAMERA_COLL_HEIGHT_BELOW + RCL_CAMERA_COLL_STEP_HEIGHT; topLimit = camera->height + RCL_CAMERA_COLL_HEIGHT_ABOVE; + + if (ceilingHeightFunc != 0) + currCeilHeight = ceilingHeightFunc(xSquare,ySquare); } // checks a single square for collision against the camera @@ -1768,7 +1773,9 @@ void RCL_moveCameraWithCollision(RCL_Camera *camera, RCL_Vector2D planeOffset, if (computeHeight)\ {\ RCL_Unit height = floorHeightFunc(s1,s2);\ - if (height > bottomLimit)\ + if (height > bottomLimit || \ + currCeilHeight - height < \ + RCL_CAMERA_COLL_HEIGHT_BELOW + RCL_CAMERA_COLL_HEIGHT_ABOVE)\ dir##Collides = 1;\ else if (ceilingHeightFunc != 0)\ {\