Make collider retrieving more permissive
This commit is contained in:
@@ -276,28 +276,10 @@ void bzTileMapDrawColliders(BzTileMap *map) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bzTileMapCanPlace(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++) {
|
|
||||||
|
|
||||||
for (i32 i = 0; i < map->layerCount; i++) {
|
|
||||||
BzTileLayer *layer = map->layers + i;
|
|
||||||
if (layer->tilesetIdx == -1) continue;
|
|
||||||
|
|
||||||
BzTileset *tileset = map->tilesets + layer->tilesetIdx;
|
|
||||||
|
|
||||||
i16 tile = bzTileLayerGetTile(layer, x, y);
|
|
||||||
BzTileShape collider = bzTilesetGetTileCollider(tileset, tile);
|
|
||||||
if (collider.type != BZ_TILE_SHAPE_NONE)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y) {
|
BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y) {
|
||||||
i32 idx = y * map->width + x;
|
i32 idx = y * map->width + x;
|
||||||
BZ_ASSERT(idx < 0 && idx < map->collidersCount);
|
if (idx < 0 || idx >= map->collidersCount) {
|
||||||
|
return (BzTileCollider) {{BZ_TILE_SHAPE_NONE}};
|
||||||
|
}
|
||||||
return map->colliderMap[idx];
|
return map->colliderMap[idx];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ void bzTileMapDestroy(BzTileMap *tilemap);
|
|||||||
|
|
||||||
void bzTileMapDraw(BzTileMap *map);
|
void bzTileMapDraw(BzTileMap *map);
|
||||||
void bzTileMapDrawColliders(BzTileMap *map);
|
void bzTileMapDrawColliders(BzTileMap *map);
|
||||||
bool bzTileMapCanPlace(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY);
|
|
||||||
BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y);
|
BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
20
game/main.c
20
game/main.c
@@ -27,6 +27,24 @@ bool handleGameObjects(BzTileObjectLayer *objectLayer) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
|
||||||
|
// Need to check neighbour tiles
|
||||||
|
tileX -= 1;
|
||||||
|
tileY -= 1;
|
||||||
|
sizeX += 2;
|
||||||
|
sizeY += 2;
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool init(Game *game) {
|
bool init(Game *game) {
|
||||||
int screenWidth = 1280;
|
int screenWidth = 1280;
|
||||||
int screenHeight = 720;
|
int screenHeight = 720;
|
||||||
@@ -100,7 +118,7 @@ void render(float dt, Game *game) {
|
|||||||
|
|
||||||
if (tileX != 0 && tileY != 0) {
|
if (tileX != 0 && tileY != 0) {
|
||||||
|
|
||||||
bool canPlace = bzTileMapCanPlace(&game->map, tileX, tileY, sizeX, sizeY);
|
bool canPlace = canBuildOn(&game->map, tileX, tileY, sizeX, sizeY);
|
||||||
Color placeColor = canPlace ?
|
Color placeColor = canPlace ?
|
||||||
(Color) {0, 255, 0, 200} :
|
(Color) {0, 255, 0, 200} :
|
||||||
(Color) {255, 0, 0, 200};
|
(Color) {255, 0, 0, 200};
|
||||||
|
|||||||
Reference in New Issue
Block a user