#include #include #include #include #include "map.h" #define TILE_SIDE 8 SDL_Texture* map_texture = NULL; void add_map_row(const char* string, struct map* map); void load_map(const char* filename, struct map* map) { if(map->contents != NULL || map->colliders != NULL) { printf("Reallocating non empty map, exitting!\n"); exit(1); } map->collider_count = 0; map->width = 0; map->height = 0; FILE* file = fopen(filename, "r"); if(file == NULL) { const char* error; switch(errno) { default: error = "Unknown Error"; } printf("Failed to load map %s, error: %s, exitting!\n",filename, error); exit(1); } map->height = 0; char buffer[1024]; fgets(buffer, 1024, file); buffer[1023] = '\0'; map->width = 1; for (unsigned long i = 0; i < strlen(buffer); i++) { if (buffer[i] == ',') map->width++; } fseek(file, 0, SEEK_SET); while(fgets(buffer, 1024, file)) { //Add another row to the map map->height++; map->contents = realloc(map->contents, map->width * map->height * sizeof(int)); add_map_row(buffer, map); } fclose(file); } void add_map_row(const char* line, struct map* map) { int* row = &map->contents[map->width * (map->height - 1)]; int width = map->width; for(int i = 0; i < width; i++) { sscanf(line, "%d", &row[i]); int length = 1; int j = row[i]; //If the current tile isn't empty add a collider here if(row[i] != -1) { map->colliders = realloc(map->colliders, ++map->collider_count * sizeof(SDL_Rect)); map->colliders[map->collider_count - 1] = (SDL_Rect) { .x = i * 26, .y = (map->height - 1) * 20, .w = 26, .h = 20 }; } if(j < 0) { length++; j = -j; } for(; j > 0; j /= 10, length++); line += length; } } void draw_map(struct demo* demo, struct map* map) { for(int i = 0; i < map->height; i++) for(int j = 0; j < map->width; j++) { int tile = map->contents[i * map->width + j]; if(tile == -1) { continue; } SDL_Rect s = { .x = (tile % 36) * TILE_SIDE, .y = (tile / 36) * TILE_SIDE, .w = TILE_SIDE, .h = TILE_SIDE }; SDL_Rect d = { .x = j * 26, .y = i * 20, .w = 26, .h = 20 }; demo_rendercopy(demo, map_texture, &s, &d); } } void map_init(struct demo* demo) { map_texture = IMG_LoadTexture(demo->ren, "assets/Sprites/Tileset.png"); if(map_texture == NULL) { printf("Failed to load map tileset, error: %s, exitting!\n", SDL_GetError()); exit(1); } }