Add object layer rendering
This commit is contained in:
@@ -146,7 +146,10 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
|
|||||||
BzTileLayer *layer = map.layers + slot;
|
BzTileLayer *layer = map.layers + slot;
|
||||||
const BzTileLayerDesc *layerDesc = desc->layers + slot;
|
const BzTileLayerDesc *layerDesc = desc->layers + slot;
|
||||||
handleTileLayer(layer, cuteLayer);
|
handleTileLayer(layer, cuteLayer);
|
||||||
if (layerDesc->handler) layerDesc->handler(layer);
|
if (layerDesc->handler && !layerDesc->handler(layer)) {
|
||||||
|
bzFree(layer->data);
|
||||||
|
layer->dataCount = 0;
|
||||||
|
}
|
||||||
map.layerCount++;
|
map.layerCount++;
|
||||||
} else {
|
} else {
|
||||||
BzTileObjectLayer *objectLayer = map.objectLayers + slot;
|
BzTileObjectLayer *objectLayer = map.objectLayers + slot;
|
||||||
@@ -155,7 +158,10 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
|
|||||||
if (!hashFunc)
|
if (!hashFunc)
|
||||||
hashFunc = bzStringDefaultHash;
|
hashFunc = bzStringDefaultHash;
|
||||||
handleTileObjectLayer(objectLayer, cuteLayer, hashFunc);
|
handleTileObjectLayer(objectLayer, cuteLayer, hashFunc);
|
||||||
if (objectLayerDesc->handler) objectLayerDesc->handler(objectLayer);
|
if (objectLayerDesc->handler && !objectLayerDesc->handler(objectLayer)) {
|
||||||
|
bzFree(objectLayer->objects);
|
||||||
|
objectLayer->objectCount = 0;
|
||||||
|
}
|
||||||
map.objectLayerCount++;
|
map.objectLayerCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,15 +234,42 @@ static void drawLayer(BzTileLayer *layer, BzTileset *tileset) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drawObjectLayer(BzTileObjectLayer *objectLayer) {
|
||||||
|
Color color = ORANGE;
|
||||||
|
for (int i = 0; i < objectLayer->objectCount; i++) {
|
||||||
|
BzTileShape shape = objectLayer->objects[i].shape;
|
||||||
|
switch (shape.type) {
|
||||||
|
case BZ_TILE_SHAPE_NONE:
|
||||||
|
break;
|
||||||
|
case BZ_TILE_SHAPE_POINT:
|
||||||
|
DrawCircle(shape.x, shape.y, 2.0f, color);
|
||||||
|
break;
|
||||||
|
case BZ_TILE_SHAPE_RECT:
|
||||||
|
DrawRectangle(shape.x, shape.y, shape.sizeX, shape.sizeY, color);
|
||||||
|
break;
|
||||||
|
case BZ_TILE_SHAPE_ELLIPSE:
|
||||||
|
DrawEllipse(shape.x, shape.y, shape.sizeX, shape.sizeY, color);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void bzTileMapDraw(BzTileMap *map) {
|
void bzTileMapDraw(BzTileMap *map) {
|
||||||
for (i32 i = 0; i < map->layerCount; i++) {
|
for (i32 i = 0; i < map->layerCount; i++) {
|
||||||
BzTileLayer *layer = map->layers + i;
|
BzTileLayer *layer = map->layers + i;
|
||||||
|
if (!layer->data) continue;
|
||||||
BzTileset *tileset = NULL;
|
BzTileset *tileset = NULL;
|
||||||
if (layer->tilesetIdx != -1) {
|
if (layer->tilesetIdx != -1) {
|
||||||
tileset = map->tilesets + layer->tilesetIdx;
|
tileset = map->tilesets + layer->tilesetIdx;
|
||||||
}
|
}
|
||||||
drawLayer(map->layers + i, tileset);
|
drawLayer(map->layers + i, tileset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i32 i = 0; i < map->objectLayerCount; i++) {
|
||||||
|
BzTileObjectLayer *objectLayer = map->objectLayers + i;
|
||||||
|
if (!objectLayer->objects) continue;
|
||||||
|
drawObjectLayer(objectLayer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bzTileMapDrawColliders(BzTileMap *map) {
|
void bzTileMapDrawColliders(BzTileMap *map) {
|
||||||
|
|||||||
@@ -25,11 +25,15 @@ typedef struct BzTileLayer {
|
|||||||
f32 opacity;
|
f32 opacity;
|
||||||
|
|
||||||
i32 tilesetIdx;
|
i32 tilesetIdx;
|
||||||
|
|
||||||
|
void *userData;
|
||||||
} BzTileLayer;
|
} BzTileLayer;
|
||||||
|
|
||||||
typedef struct BzTileObject {
|
typedef struct BzTileObject {
|
||||||
u32 id;
|
u32 id;
|
||||||
BzTileShape shape;
|
BzTileShape shape;
|
||||||
|
|
||||||
|
void *userData;
|
||||||
} BzTileObject;
|
} BzTileObject;
|
||||||
|
|
||||||
typedef struct BzTileObjectLayer {
|
typedef struct BzTileObjectLayer {
|
||||||
@@ -37,17 +41,22 @@ typedef struct BzTileObjectLayer {
|
|||||||
i32 objectCount;
|
i32 objectCount;
|
||||||
} BzTileObjectLayer;
|
} BzTileObjectLayer;
|
||||||
|
|
||||||
// Return true, if it should be added to map
|
// Return true, if you want to keep data allocated
|
||||||
typedef bool BzTileLayerHandler(BzTileLayer *layer);
|
typedef bool BzTileLayerFunc(BzTileLayer *layer);
|
||||||
typedef bool BzTileObjectsHandler(BzTileObjectLayer *objectLayer);
|
typedef bool BzTileObjectsFunc(BzTileObjectLayer *objectLayer);
|
||||||
|
|
||||||
|
typedef void BzTileLayerRenderFunc(BzTileLayer *layer);
|
||||||
|
typedef void BzTileObjectsRenderFunc(BzTileObjectLayer *objectLayer);
|
||||||
|
|
||||||
typedef struct BzTileLayerDesc {
|
typedef struct BzTileLayerDesc {
|
||||||
const char *name; // Matches map layer names
|
const char *name; // Matches map layer names
|
||||||
BzTileLayerHandler *handler;
|
BzTileLayerFunc *handler;
|
||||||
|
BzTileLayerRenderFunc *renderer;
|
||||||
} BzTileLayerDesc;
|
} BzTileLayerDesc;
|
||||||
typedef struct BzTileObjectsDesc {
|
typedef struct BzTileObjectsDesc {
|
||||||
const char *name; // Matches map layer names
|
const char *name; // Matches map layer names
|
||||||
BzTileObjectsHandler *handler;
|
BzTileObjectsFunc *handler;
|
||||||
|
BzTileObjectsRenderFunc *renderer;
|
||||||
BzStringHashFunc *hashFunc;
|
BzStringHashFunc *hashFunc;
|
||||||
} BzTileObjectsDesc;
|
} BzTileObjectsDesc;
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ bool handleGameObjects(BzTileObjectLayer *objectLayer) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool handleBuildLayer(BzTileLayer *layer) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
|
bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
|
||||||
// Ensure that it is within the map
|
// Ensure that it is within the map
|
||||||
if (tileX < 0 || tileX + sizeX > map->width ||
|
if (tileX < 0 || tileX + sizeX > map->width ||
|
||||||
@@ -106,7 +110,7 @@ bool init(Game *game) {
|
|||||||
.layers[1]=(BzTileLayerDesc) {"Foliage", NULL},
|
.layers[1]=(BzTileLayerDesc) {"Foliage", NULL},
|
||||||
.layers[2]=(BzTileLayerDesc) {"Trees", NULL},
|
.layers[2]=(BzTileLayerDesc) {"Trees", NULL},
|
||||||
.layers[3]=(BzTileLayerDesc) {"TreesS", NULL},
|
.layers[3]=(BzTileLayerDesc) {"TreesS", NULL},
|
||||||
.layers[4]=(BzTileLayerDesc) {"Buildings", NULL},
|
.layers[4]=(BzTileLayerDesc) {"Buildings", handleBuildLayer},
|
||||||
|
|
||||||
.objectLayers[0]=(BzTileObjectsDesc) {"Game", handleGameObjects},
|
.objectLayers[0]=(BzTileObjectsDesc) {"Game", handleGameObjects},
|
||||||
.objectLayers[1]=(BzTileObjectsDesc ) {"Entities", NULL}
|
.objectLayers[1]=(BzTileObjectsDesc ) {"Entities", NULL}
|
||||||
|
|||||||
Reference in New Issue
Block a user