From 582074256cb129d1b297258556f40834f9996355 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Wed, 13 Dec 2023 16:23:38 +0100 Subject: [PATCH] Add animations to terrain layer --- engine/breeze/map/map.c | 5 ++++- game/main.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/engine/breeze/map/map.c b/engine/breeze/map/map.c index 222ef3c..28d93f2 100644 --- a/engine/breeze/map/map.c +++ b/engine/breeze/map/map.c @@ -465,7 +465,10 @@ void bzTileMapDraw(BzTileMap *map) { if (layer->tilesetIdx != -1) { tileset = map->tilesets + layer->tilesetIdx; } - drawLayer(map->layers + i, tileset); + if (layer->desc.renderer) + layer->desc.renderer(map, layer); + else + drawLayer(map->layers + i, tileset); } for (i32 i = 0; i < map->objectGroupCount; i++) { diff --git a/game/main.c b/game/main.c index 6751ad8..225ba60 100644 --- a/game/main.c +++ b/game/main.c @@ -46,6 +46,37 @@ bool bzMain(BzAppDesc *appDesc, int argc, const char **argv) { return true; } +void terrainRender(BzTileMap *map, BzTileLayer *layer) { + BzTileset *tileset = bzTileLayerGetTileset(map, layer); + + + Vector2 drawPos = {layer->offsetX, layer->offsetY}; + + static f32 elapsed = 0.0f; + elapsed += GetFrameTime(); + + for (i32 y = 0; y < layer->height; y++) { + for (i32 x = 0; x < layer->width; x++) { + BzTile tile = bzTileLayerGetTile(layer, x, y); + tile = bzTilesetGetTile(tileset, tile); + if (tile != -1) { + if (terrainHasAnimation(tile)) { + f32 frameDuration = terrainGetAnimationFrame(tile, 0).duration / 1000.0f; + i32 numFrames = terrainGetAnimationSequence(tile).frameCount; + i32 frameIdx = (i32) (elapsed / frameDuration) % numFrames; + tile = terrainGetAnimationFrame(tile, frameIdx).frame; + } + tile += tileset->startID; + Rectangle rec = bzTilesetGetTileRegion(tileset, tile); + DrawTextureRec(tileset->tiles, rec, drawPos, WHITE); + } + drawPos.x += (float) tileset->tileWidth; + } + drawPos.x = layer->offsetX; + drawPos.y += (float) tileset->tileHeight; + } +} + bool init(void *userData) { BZ_UNUSED(userData); SetExitKey(0); @@ -103,7 +134,7 @@ bool init(void *userData) { .generateCollisionMap=true, .tilesets[0]=game->tileset, - .layers[LAYER_TERRAIN]=(BzTileLayerDesc) {"terrain", .applyColliders=true}, + .layers[LAYER_TERRAIN]=(BzTileLayerDesc) {"terrain", .renderer=terrainRender, .applyColliders=true}, .layers[LAYER_ROCKS]=(BzTileLayerDesc) {"rocks"}, .layers[LAYER_ROCKS2]=(BzTileLayerDesc) {"rocks_s"}, .layers[LAYER_TREES]=(BzTileLayerDesc) {"trees"},