diff options
author | BoredGuy <osome3717@gmail.com> | 2024-12-23 12:32:54 +0300 |
---|---|---|
committer | BoredGuy <osome3717@gmail.com> | 2024-12-23 12:32:54 +0300 |
commit | 61252071880c625b367623191cc86b3a98b8d562 (patch) | |
tree | 4718d62c7b13e4f7482a6ee7cdb33cec3e5d69b4 /Week1-Pacman/src | |
parent | ac7ba6dc94f6eb2d8cf9092391714247bb947148 (diff) |
Work started on adding a level system
- Levels load from tiled CSV export
- Levels also draw
We need to add collisions with the level and adjust the level's width
and height to fit well in a 4:3 window
Diffstat (limited to 'Week1-Pacman/src')
-rw-r--r-- | Week1-Pacman/src/main.c | 32 | ||||
-rw-r--r-- | Week1-Pacman/src/map.c | 115 | ||||
-rw-r--r-- | Week1-Pacman/src/map.h | 20 |
3 files changed, 155 insertions, 12 deletions
diff --git a/Week1-Pacman/src/main.c b/Week1-Pacman/src/main.c index e4113be..373d795 100644 --- a/Week1-Pacman/src/main.c +++ b/Week1-Pacman/src/main.c @@ -3,6 +3,7 @@ #include <stdbool.h> #include "demo.h" #include "pacman.h" +#include "map.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 @@ -25,10 +26,16 @@ int main() { SDL_Event e; struct pacman pacman = {0}; + + map_init(&demo); + + struct map map = {0}; + load_map("assets/Maps/maze.csv", &map); + for(int i = 0; i < 4; i++) init_animation(&pacman.animations[i], &(struct animation_init){ .ren = demo.ren, - .spritesheet = "assets/sprites.png", + .spritesheet = "assets/Sprites/sprites.png", .initial_angle = 90.0 * i, .initial_frame_count = 3, @@ -36,21 +43,21 @@ int main() { .initial_frames = (SDL_Rect[]) { { .x = 0, - .y = 190, - .w = 120, - .h = 130 + .y = 285, + .w = 180, + .h = 195 }, { - .x = 160, - .y = 190, - .w = 120, - .h = 130 + .x = 240, + .y = 285, + .w = 180, + .h = 195 }, { - .x = 310, - .y = 190, - .w = 130, - .h = 130 + .x = 465, + .y = 285, + .w = 195, + .h = 195 } } }); @@ -74,6 +81,7 @@ int main() { SDL_RenderClear(demo.ren); update_pacman(&pacman, dt); update_demo(&demo); + draw_map(&demo, &map); draw_pacman(&demo, &pacman); SDL_RenderPresent(demo.ren); } diff --git a/Week1-Pacman/src/map.c b/Week1-Pacman/src/map.c new file mode 100644 index 0000000..0610fd4 --- /dev/null +++ b/Week1-Pacman/src/map.c @@ -0,0 +1,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); + } +} diff --git a/Week1-Pacman/src/map.h b/Week1-Pacman/src/map.h new file mode 100644 index 0000000..2161806 --- /dev/null +++ b/Week1-Pacman/src/map.h @@ -0,0 +1,20 @@ +#ifndef MAP_H_ +#define MAP_H_ + +#include "demo.h" + +struct map { + int* contents; + + int width; + int height; +}; + +/* + * Load map exported as CSV file from tiled. +*/ +void load_map(const char* filename, struct map* map); +void draw_map(struct demo* demo, struct map* map); +void map_init(struct demo* demo); + +#endif // MAP_H_ |