From 185c9ded6ed6603b42354264494214492eb1e37c Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Thu, 9 Nov 2023 10:48:33 +0100 Subject: [PATCH] Fix collision checking when building --- engine/breeze/world/map.c | 4 +--- engine/breeze/world/tileset.c | 8 ++++++++ game/main.c | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/engine/breeze/world/map.c b/engine/breeze/world/map.c index 5d03052..ff0da67 100644 --- a/engine/breeze/world/map.c +++ b/engine/breeze/world/map.c @@ -264,9 +264,7 @@ void bzTileMapDrawColliders(BzTileMap *map) { DrawRectangleLines(posX, posY, sizeX, sizeY, color); break; case BZ_TILE_SHAPE_ELLIPSE: - sizeX *= 0.5f; - sizeY *= 0.5f; - DrawEllipseLines(posX + sizeX, posY + sizeY, sizeX, sizeY, color); + DrawEllipseLines(posX, posY, sizeX, sizeY, color); break; } } diff --git a/engine/breeze/world/tileset.c b/engine/breeze/world/tileset.c index 48484c5..fac7cf5 100644 --- a/engine/breeze/world/tileset.c +++ b/engine/breeze/world/tileset.c @@ -22,6 +22,14 @@ BzTileShape bzCuteObjectToTileShape(cute_tiled_object_t *object) { shape.sizeX = object->width; shape.sizeY = object->height; + if (shape.type == BZ_TILE_SHAPE_ELLIPSE) { + // Adjust to use radius and position to be center + shape.sizeX *= 0.5f; + shape.sizeY *= 0.5f; + shape.x += shape.sizeX; + shape.y += shape.sizeY; + } + return shape; } diff --git a/game/main.c b/game/main.c index 7c32082..e1acefe 100644 --- a/game/main.c +++ b/game/main.c @@ -29,10 +29,13 @@ bool handleGameObjects(BzTileObjectLayer *objectLayer) { bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { // Ensure that it is within the map - if (tileX < 0 || tileX >= map->width || - tileY < 0 || tileY >= map->height) + if (tileX < 0 || tileX + sizeX > map->width || + tileY < 0 || tileY + sizeY > map->height) return false; + Rectangle buildArea = {tileX * map->tileWidth, tileY * map->tileHeight, + sizeX * map->tileWidth, sizeY * map->tileHeight}; + // Need to check neighbour tiles // FIXME: Can't place right next to obstacle tileX -= 1; @@ -44,7 +47,31 @@ bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { for (i32 y = tileY; y < tileY + sizeY; y++) { for (i32 x = tileX; x < tileX + sizeX; x++) { BzTileCollider collider = bzTileMapGetCollider(map, x, y); - if (collider.shapes[0].type != BZ_TILE_SHAPE_NONE) return false; + f32 posX = x * map->tileWidth; + f32 posY = y * map->tileHeight; + for (int i = 0; i < BZ_MAP_COLLIDER_DEPTH; i++) { + BzTileShape shape = collider.shapes[i]; + shape.x += posX; + shape.y += posY; + switch (shape.type) { + case BZ_TILE_SHAPE_NONE: + case BZ_TILE_SHAPE_POINT: + break; + case BZ_TILE_SHAPE_RECT: { + Rectangle shapeRec = {shape.x, shape.y, shape.sizeX, shape.sizeY}; + if (CheckCollisionRecs(buildArea, shapeRec)) + return false; + break; + } + case BZ_TILE_SHAPE_ELLIPSE: { + Vector2 pos = {shape.x, shape.y}; + f32 radius = (shape.sizeX + shape.sizeY) * 0.5f; + if (CheckCollisionCircleRec(pos, radius, buildArea)) + return false; + break; + } + } + } } }