1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include <stdio.h>
#include <errno.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include "map.h"
#define TILE_SIDE 8
SDL_Texture* map_texture = NULL;
void add_map_row(const char* string, int* row, int width);
void load_map(const char* filename, struct map* map) {
if(map->contents != NULL) {
printf("Reallocating non empty map, exitting!\n");
exit(1);
}
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->contents[map->width * (map->height - 1)],
map->width);
}
fclose(file);
}
void add_map_row(const char* line, int* row, int width) {
for(int i = 0; i < width; i++) {
sscanf(line, "%d", &row[i]);
int length = 1;
int j = row[i];
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);
}
}
|