diff options
| -rw-r--r-- | include/map_manager.h | 18 | ||||
| -rw-r--r-- | src/map_manager.c | 115 |
2 files changed, 133 insertions, 0 deletions
diff --git a/include/map_manager.h b/include/map_manager.h new file mode 100644 index 0000000..46ec63e --- /dev/null +++ b/include/map_manager.h @@ -0,0 +1,18 @@ +#ifndef MAP_MANAGER_H +#define MAP_MANAGER_H + +#include "raytmx.h" + +typedef struct MapManager { + TmxMap *map; + TmxLayer *wallLayer; + TmxLayer *solidLayer; + TmxLayer *pickupLayer; +} MapManager; + +MapManager LoadGameMap(const char *fileName); +void UnloadGameMap(MapManager *mgr); +bool IsWallCollision(MapManager *mgr, Rectangle rect); +void DrawMap(MapManager *mgr); + +#endif diff --git a/src/map_manager.c b/src/map_manager.c new file mode 100644 index 0000000..bcb9063 --- /dev/null +++ b/src/map_manager.c @@ -0,0 +1,115 @@ +#include "map_manager.h" +#include "entity.h" +#include "raytmx.h" +#include "globals.h" + +// Forward declaration of internal raytmx function +void DrawTMXLayerTile(const TmxMap* map, Rectangle viewport, uint32_t rawGid, Rectangle destRect, Color tint); + +MapManager LoadGameMap(const char *fileName) { + MapManager mgr = {0}; + mgr.map = LoadTMX(fileName); + + // Cache layers for faster access + if (mgr.map) { + for (uint32_t i = 0; i < mgr.map->layersLength; i++) { + if (strcmp(mgr.map->layers[i].name, "Walls") == 0 && + mgr.map->layers[i].type == LAYER_TYPE_TILE_LAYER) { + mgr.wallLayer = &mgr.map->layers[i]; + } + if (strcmp(mgr.map->layers[i].name, "Solid") == 0 && + mgr.map->layers[i].type == LAYER_TYPE_TILE_LAYER) { + mgr.solidLayer = &mgr.map->layers[i]; + } + if (strcmp(mgr.map->layers[i].name, "Collectible") == 0 || + strcmp(mgr.map->layers[i].name, "Pickups") == 0) + mgr.pickupLayer = &mgr.map->layers[i]; + } + } + return mgr; +} + +void UnloadGameMap(MapManager *mgr) { + if (mgr->map) { + UnloadTMX(mgr->map); + mgr->map = NULL; + } +} + +bool IsWallCollision(MapManager *mgr, Rectangle rect) { + // Check main walls + if (mgr->wallLayer && CheckCollisionTMXTileLayersRec(mgr->map, mgr->wallLayer, 1, rect, NULL)) + return true; + + // Check additional solid layer (props, etc) + if (mgr->solidLayer && CheckCollisionTMXTileLayersRec(mgr->map, mgr->solidLayer, 1, rect, NULL)) + return true; + + return false; +} + +// Internal helper for debug rendering +static void DrawDebugTileCollision(TmxMap *map, TmxLayer *layer, Color color) { + if (!layer || layer->type != LAYER_TYPE_TILE_LAYER) return; + + TmxTileLayer *tileLayer = &layer->exact.tileLayer; + for (uint32_t y = 0; y < tileLayer->height; y++) { + for (uint32_t x = 0; x < tileLayer->width; x++) { + uint32_t gid = tileLayer->tiles[y * tileLayer->width + x]; + if (gid != 0 && gid < map->gidsToTilesLength) { + TmxTile tileData = map->gidsToTiles[gid]; + for (uint32_t objIdx = 0; objIdx < tileData.objectGroup.objectsLength; objIdx++) { + TmxObject obj = tileData.objectGroup.objects[objIdx]; + DrawRectangleLinesEx((Rectangle){ + (float)x * TILE_SIZE + (float)obj.x, + (float)y * TILE_SIZE + (float)obj.y, + (float)obj.width, + (float)obj.height + }, 0.5f, color); + } + } + } + } +} + +void DrawMap(MapManager *mgr) { + AnimateTMX(mgr->map); + DrawTMX(mgr->map, NULL, NULL, 0, 0, WHITE); + + if (debugMode) { + DrawDebugTileCollision(mgr->map, mgr->wallLayer, RED); + DrawDebugTileCollision(mgr->map, mgr->solidLayer, RED); + } +} + +void DrawEntities(EntityManager *mgr, TmxMap *map) { + Rectangle drawViewport = {-1000, -1000, 5000, 5000}; + + for (int i = 0; i < mgr->collectiblesCount; i++) { + if (mgr->collectibles[i].active) { + // Pickups are drawn by the map renderer (DrawTMX). + // We only draw the debug hitbox here. + if (debugMode) { + DrawRectangleLinesEx(mgr->collectibles[i].bounds, 0.5f, GREEN); + } + } + } + + for (int i = 0; i < mgr->movablesCount; i++) { + DrawTMXLayerTile(map, drawViewport, mgr->movables[i].gid, + mgr->movables[i].bounds, WHITE); + if (debugMode) { + DrawRectangleLinesEx(mgr->movables[i].bounds, 0.5f, GREEN); + } + } + + for (int i = 0; i < mgr->enemiesCount; i++) { + if (mgr->enemies[i].active) { + DrawTMXLayerTile(map, drawViewport, mgr->enemies[i].gid, + mgr->enemies[i].bounds, WHITE); + if (debugMode) { + DrawRectangleLinesEx(mgr->enemies[i].bounds, 0.5f, RED); + } + } + } +} |
