diff --git a/assets/entities.png b/assets/entities.png
new file mode 100644
index 0000000..1961067
Binary files /dev/null and b/assets/entities.png differ
diff --git a/assets/entities.tsj b/assets/entities.tsj
new file mode 100644
index 0000000..18fb954
--- /dev/null
+++ b/assets/entities.tsj
@@ -0,0 +1,14 @@
+{ "columns":64,
+ "image":"entities.png",
+ "imageheight":1024,
+ "imagewidth":1024,
+ "margin":0,
+ "name":"entities",
+ "spacing":0,
+ "tilecount":4096,
+ "tiledversion":"1.10.2",
+ "tileheight":16,
+ "tilewidth":16,
+ "type":"tileset",
+ "version":"1.10"
+}
\ No newline at end of file
diff --git a/assets/maps/test.tmj b/assets/maps/test.tmj
index 6d6b698..096d0bd 100644
--- a/assets/maps/test.tmj
+++ b/assets/maps/test.tmj
@@ -374,7 +374,19 @@
"draworder":"topdown",
"id":31,
"name":"Entities",
- "objects":[],
+ "objects":[
+ {
+ "gid":1322,
+ "height":10,
+ "id":19728,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":10,
+ "x":1095.25,
+ "y":405.75
+ }],
"opacity":1,
"type":"objectgroup",
"visible":true,
@@ -405,7 +417,7 @@
"y":0
}],
"nextlayerid":33,
- "nextobjectid":19728,
+ "nextobjectid":19729,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.10.2",
@@ -418,6 +430,10 @@
{
"firstgid":298,
"source":"..\/..\/tiled\/buildings.tsx"
+ },
+ {
+ "firstgid":1322,
+ "source":"..\/..\/tiled\/entities.tsx"
}],
"tilewidth":16,
"type":"map",
diff --git a/engine/breeze/map/map.c b/engine/breeze/map/map.c
index ee93c85..8e9ba77 100644
--- a/engine/breeze/map/map.c
+++ b/engine/breeze/map/map.c
@@ -88,6 +88,11 @@ static void handleTileObjectLayer(BzTileObjectGroup *layer, cute_tiled_layer_t *
object = cuteLayer->objects;
for (i32 i = 0; i < layer->objectCount; i++) {
layer->objects[i].id = hashFunc(object->name.ptr);
+
+ layer->objects[i].gid = object->gid;
+ if (layer->minGID > object->gid) layer->minGID = object->gid;
+ else if (layer->maxGID < object->gid) layer->maxGID = object->gid;
+
layer->objects[i].shape = bzCuteObjectToTileShape(object);
object = object->next;
}
@@ -142,7 +147,7 @@ static void createColliders(BzTileMap *map) {
BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
BzTileMap map = {};
// Auto detect tileset count.
- for (i32 i = 0; i < BZ_MAX_MAP_TILESETS; i++) {
+ for (i32 i = 0; i < BZ_MAP_MAX_TILESETS; i++) {
if (!desc->tilesets[i].isValid)
break;
map.tilesetCount++;
@@ -162,12 +167,12 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
cute_tiled_layer_t *cuteLayer = cuteMap->layers;
while (cuteLayer) {
- BZ_ASSERT(map.layerCount < BZ_MAX_MAP_LAYERS);
- BZ_ASSERT(map.objectGroupCount < BZ_MAX_MAP_LAYERS);
+ BZ_ASSERT(map.layerCount < BZ_MAP_MAX_LAYERS);
+ BZ_ASSERT(map.objectGroupCount < BZ_MAP_MAX_LAYERS);
// Find slot
i32 slot = -1;
- for (i32 i = 0; i < BZ_MAX_MAP_LAYERS; i++) {
+ for (i32 i = 0; i < BZ_MAP_MAX_LAYERS; i++) {
const BzTileLayerDesc *layerDesc = desc->layers + i;
const BzTileObjectsDesc *objectsDesc = desc->objectGroups + i;
if (layerDesc->name && strcmp(layerDesc->name, cuteLayer->name.ptr) == 0 ||
@@ -216,17 +221,29 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
}
// Assign tilesets to layers
- for (i32 i = 0; i < map.layerCount; i++) {
+ for (i32 i = 0; i < BZ_MAP_MAX_LAYERS; i++) {
BzTileLayer *layer = map.layers + i;
layer->tilesetIdx = -1;
+ BzTileObjectGroup *objects = map.objectGroups + i;
+ objects->tilesetIdx = -1;
+
+ bool hasLayer = i < map.layerCount;
+ bool hasObjects = i < map.objectGroupCount;
+
for (i32 j = map.tilesetCount - 1; j >= 0; j--) {
BzTileset *tileset = map.tilesets + j;
- if (tileset->startID >= layer->minData &&
+ if (hasLayer && tileset->startID >= layer->minData &&
tileset->startID <= layer->maxData) {
layer->tilesetIdx = j;
- break;
+ hasLayer = false;
}
+ if (hasObjects && tileset->startID >= objects->minGID &&
+ tileset->startID <= objects->maxGID) {
+ objects->tilesetIdx = j;
+ hasObjects = false;
+ }
+ if (!hasLayer && !hasObjects) break;
}
}
cute_tiled_free_map(cuteMap);
@@ -316,10 +333,11 @@ static void drawLayer(BzTileLayer *layer, BzTileset *tileset) {
}
-static void drawObjectLayer(BzTileObjectGroup *objectLayer) {
+static void drawObjectLayer(BzTileObjectGroup *objectLayer, BzTileset *tileset) {
Color color = ORANGE;
for (int i = 0; i < objectLayer->objectCount; i++) {
- BzTileShape shape = objectLayer->objects[i].shape;
+ BzTileObject object = objectLayer->objects[i];
+ BzTileShape shape = object.shape;
switch (shape.type) {
case BZ_TILE_SHAPE_NONE:
break;
@@ -327,7 +345,13 @@ static void drawObjectLayer(BzTileObjectGroup *objectLayer) {
DrawCircle(shape.x, shape.y, 2.0f, color);
break;
case BZ_TILE_SHAPE_RECT:
- DrawRectangle(shape.x, shape.y, shape.sizeX, shape.sizeY, color);
+ if (object.gid) {
+ Rectangle rec = bzTilesetGetTileRegion(tileset, object.gid);
+ Rectangle dest = {shape.x, shape.y, shape.sizeX, shape.sizeY};
+ DrawTexturePro(tileset->tiles, rec, dest, (Vector2) {0.0f, 0.0f}, 0.0f, WHITE);
+ } else {
+ 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);
@@ -358,8 +382,12 @@ void bzTileMapDraw(BzTileMap *map) {
for (i32 i = 0; i < map->objectGroupCount; i++) {
BzTileObjectGroup *objectLayer = map->objectGroups + i;
+ BzTileset *tileset = NULL;
+ if (objectLayer->tilesetIdx != -1) {
+ tileset = map->tilesets + objectLayer->tilesetIdx;
+ }
if (!objectLayer->objects) continue;
- drawObjectLayer(objectLayer);
+ drawObjectLayer(objectLayer, tileset);
}
}
diff --git a/engine/breeze/map/map.h b/engine/breeze/map/map.h
index 04c35ea..0d38ec7 100644
--- a/engine/breeze/map/map.h
+++ b/engine/breeze/map/map.h
@@ -4,8 +4,8 @@
#include "tileset.h"
#include "../utils/string.h"
-#define BZ_MAX_MAP_LAYERS 8
-#define BZ_MAX_MAP_TILESETS 8
+#define BZ_MAP_MAX_LAYERS 8
+#define BZ_MAP_MAX_TILESETS 8
#define BZ_MAP_COLLIDER_DEPTH 2
typedef struct BzTileLayer BzTileLayer;
@@ -30,10 +30,10 @@ typedef struct BzTileObjectsDesc {
typedef struct BzTileMapDesc {
const char *path;
- BzTileset tilesets[BZ_MAX_MAP_TILESETS];
+ BzTileset tilesets[BZ_MAP_MAX_TILESETS];
- BzTileLayerDesc layers[BZ_MAX_MAP_LAYERS];
- BzTileObjectsDesc objectGroups[BZ_MAX_MAP_LAYERS];
+ BzTileLayerDesc layers[BZ_MAP_MAX_LAYERS];
+ BzTileObjectsDesc objectGroups[BZ_MAP_MAX_LAYERS];
} BzTileMapDesc;
typedef struct BzTileLayer {
@@ -59,12 +59,16 @@ typedef struct BzTileLayer {
typedef struct BzTileObject {
u32 id;
+ BzTile gid;
BzTileShape shape;
} BzTileObject;
typedef struct BzTileObjectGroup {
BzTileObject *objects;
i32 objectCount;
+ BzTile minGID;
+ BzTile maxGID;
+ i32 tilesetIdx;
BzTileObjectsDesc desc;
bool hasOwnership;
@@ -86,13 +90,13 @@ typedef struct BzTileMap {
BzTileCollider *colliderMap;
i32 collidersCount;
- BzTileLayer layers[BZ_MAX_MAP_LAYERS];
+ BzTileLayer layers[BZ_MAP_MAX_LAYERS];
i32 layerCount;
- BzTileObjectGroup objectGroups[BZ_MAX_MAP_LAYERS];
+ BzTileObjectGroup objectGroups[BZ_MAP_MAX_LAYERS];
i32 objectGroupCount;
- BzTileset tilesets[BZ_MAX_MAP_TILESETS];
+ BzTileset tilesets[BZ_MAP_MAX_TILESETS];
i32 tilesetCount;
bool isValid;
diff --git a/game/main.c b/game/main.c
index f9a516f..c247464 100644
--- a/game/main.c
+++ b/game/main.c
@@ -27,6 +27,7 @@ typedef struct Game {
Camera2D camera;
BzTileset terrainTileset;
BzTileset buildingsTileset;
+ BzTileset entitiesTileset;
BzTileMap map;
} Game;
@@ -204,11 +205,16 @@ bool init(Game *game) {
.path="assets/buildings.tsj",
.texturePath="assets/buildings.png"
});
+ game->entitiesTileset = bzTilesetCreate(&(BzTilesetDesc) {
+ .path="assets/entities.tsj",
+ .texturePath="assets/entities.png"
+ });
game->map = bzTileMapCreate(&(BzTileMapDesc) {
.path="assets/maps/test.tmj",
.tilesets[0]=game->terrainTileset,
.tilesets[1]=game->buildingsTileset,
+ .tilesets[2]=game->entitiesTileset,
.layers[LAYER_TERRAIN]=(BzTileLayerDesc) {"Terrain"},
.layers[LAYER_FOLIAGE]=(BzTileLayerDesc) {"Foliage"},
@@ -224,15 +230,16 @@ bool init(Game *game) {
bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, prepareBuildings);
bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, handleGameObjects);
- bzTileMapOverrideObjectGroup(&game->map, OBJECTS_ENTITIES, BZ_TILE_OBJECTS_CLEAR);
+ //bzTileMapOverrideObjectGroup(&game->map, OBJECTS_ENTITIES, BZ_TILE_OBJECTS_CLEAR);
return true;
}
void deinit(Game *game) {
+ bzTileMapDestroy(&game->map);
bzTilesetDestroy(&game->terrainTileset);
bzTilesetDestroy(&game->buildingsTileset);
- bzTileMapDestroy(&game->map);
+ bzTilesetDestroy(&game->entitiesTileset);
rlImGuiShutdown();
}
diff --git a/rawAssets/entities.kra b/rawAssets/entities.kra
new file mode 100644
index 0000000..5c20fff
Binary files /dev/null and b/rawAssets/entities.kra differ
diff --git a/rawAssets/entities.png b/rawAssets/entities.png
new file mode 100644
index 0000000..1961067
Binary files /dev/null and b/rawAssets/entities.png differ
diff --git a/tiled/entities.tsx b/tiled/entities.tsx
new file mode 100644
index 0000000..1d02d28
--- /dev/null
+++ b/tiled/entities.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/tiled/test.tmx b/tiled/test.tmx
index 6249f7f..e4d242e 100644
--- a/tiled/test.tmx
+++ b/tiled/test.tmx
@@ -1,10 +1,11 @@
-