Support for colliders
This commit is contained in:
@@ -1,31 +1,57 @@
|
||||
#include <assert.h>
|
||||
#include <cute_tiled.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <cute_tiled.h>
|
||||
|
||||
#include "tileset.h"
|
||||
#include "../core/memory.h"
|
||||
|
||||
BzTileset BZ_TILESET_INVALID = {.isValid = false};
|
||||
|
||||
BzTileset bzTilesetCreate(const BzTilesetDesc *desc) {
|
||||
BzTileset tileset = {};
|
||||
cute_tiled_tileset_t *source = cute_tiled_load_external_tileset(desc->path, NULL);
|
||||
cute_tiled_tileset_t *cuteTileset = cute_tiled_load_external_tileset(desc->path, NULL);
|
||||
|
||||
tileset.tiles = LoadTexture(desc->texturePath);
|
||||
tileset.startID = source->firstgid;
|
||||
tileset.tileWidth = source->tilewidth;
|
||||
tileset.tileHeight = source->tileheight;
|
||||
tileset.startID = cuteTileset->firstgid;
|
||||
tileset.tileWidth = cuteTileset->tilewidth;
|
||||
tileset.tileHeight = cuteTileset->tileheight;
|
||||
|
||||
tileset.offsetX = source->tileoffset_x;
|
||||
tileset.offsetY = source->tileoffset_y;
|
||||
tileset.offsetX = cuteTileset->tileoffset_x;
|
||||
tileset.offsetY = cuteTileset->tileoffset_y;
|
||||
|
||||
tileset.width = tileset.tiles.width / tileset.tileWidth;
|
||||
tileset.height = tileset.tiles.height / tileset.tileHeight;
|
||||
|
||||
cute_tiled_free_external_tileset(source);
|
||||
tileset.tileCount = tileset.width * tileset.tileHeight;
|
||||
tileset.tileColliders = bzAlloc(tileset.tileCount * sizeof(*tileset.tileColliders));
|
||||
for (i32 i = 0; i < tileset.tileCount; i++) {
|
||||
tileset.tileColliders[i] = (BzTileCollider) {BZ_TILE_COLLIDER_NONE};
|
||||
}
|
||||
|
||||
if (tileset.tiles.width != source->imagewidth ||
|
||||
tileset.tiles.height != source->imageheight) {
|
||||
cute_tiled_tile_descriptor_t *cuteTile = cuteTileset->tiles;
|
||||
while (cuteTile) {
|
||||
if (!cuteTile->objectgroup) break;
|
||||
cute_tiled_object_t *cuteObject = cuteTile->objectgroup->objects;
|
||||
// NOTE: Only supporting single collider (integer values)
|
||||
if (cuteObject) {
|
||||
if (cuteObject->vertices) break;
|
||||
|
||||
BzTileCollider collider = {BZ_TILE_COLLIDER_RECT};
|
||||
if (cuteObject->ellipse)
|
||||
collider.type = BZ_TILE_COLLIDER_ELLIPSE;
|
||||
collider.x = (i8) cuteObject->x;
|
||||
collider.y = (i8) cuteObject->y;
|
||||
collider.sizeX = (i8) cuteObject->width;
|
||||
collider.sizeY = (i8) cuteObject->height;
|
||||
|
||||
tileset.tileColliders[cuteTile->tile_index] = collider;
|
||||
}
|
||||
cuteTile = cuteTile->next;
|
||||
}
|
||||
|
||||
cute_tiled_free_external_tileset(cuteTileset);
|
||||
|
||||
if (tileset.tiles.width != cuteTileset->imagewidth ||
|
||||
tileset.tiles.height != cuteTileset->imageheight) {
|
||||
bzTilesetDestroy(&tileset);
|
||||
return BZ_TILESET_INVALID;
|
||||
}
|
||||
@@ -36,11 +62,23 @@ BzTileset bzTilesetCreate(const BzTilesetDesc *desc) {
|
||||
|
||||
Rectangle bzTilesetGetTileRegion(BzTileset *tileset, int tileID) {
|
||||
tileID = tileID - tileset->startID;
|
||||
if (tileID < 0 || tileID >= tileset->tileCount) {
|
||||
return (Rectangle){};
|
||||
}
|
||||
int posX = tileID % tileset->width;
|
||||
int posY = tileID / tileset->width;
|
||||
return (Rectangle) {posX * tileset->tileWidth, posY * tileset->tileHeight,
|
||||
tileset->tileWidth, tileset->tileHeight};
|
||||
}
|
||||
BzTileCollider bzTilesetGetTileCollider(BzTileset *tileset, int tileID) {
|
||||
tileID = tileID - tileset->startID;
|
||||
|
||||
if (tileID < 0 || tileID >= tileset->tileCount) {
|
||||
return (BzTileCollider) {.type = BZ_TILE_COLLIDER_NONE};
|
||||
}
|
||||
|
||||
return tileset->tileColliders[tileID];
|
||||
}
|
||||
|
||||
void bzTilesetDestroy(BzTileset *tileset) {
|
||||
UnloadTexture(tileset->tiles);
|
||||
|
||||
Reference in New Issue
Block a user