From 0cdd0f6d8dfc1722ecfcb407b8913aa1ccd69a60 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Sat, 2 Dec 2017 16:24:31 +0100 Subject: [PATCH] Extended linked list and re-thought the map structure --- CMakeLists.txt | 1 + linkedlist/check_linkedlist.c | 29 +++++++++++++++++++++++++++++ linkedlist/linkedlist.c | 10 ++++++++++ linkedlist/linkedlist.h | 2 ++ src/map.c | 31 +++++++++++++------------------ src/map.h | 10 ++++++++-- 6 files changed, 63 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a506fa..91c4ad1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ target_link_libraries(breakhack -lSDL2_mixer -lSDL2_ttf -lX11 + -lXrandr ) # TESTS: diff --git a/linkedlist/check_linkedlist.c b/linkedlist/check_linkedlist.c index e166d4b..438d219 100644 --- a/linkedlist/check_linkedlist.c +++ b/linkedlist/check_linkedlist.c @@ -114,6 +114,34 @@ START_TEST(test_linkedlist_pop) } END_TEST +START_TEST(test_linkedlist_get_index) +{ + int value1 = 1; + int value2 = 2; + + int *get; + + LinkedList *list = linkedlist_create(); + + ck_assert(linkedlist_size(list) == 0); + + linkedlist_push(&list, &value2, sizeof(int)); + linkedlist_push(&list, &value1, sizeof(int)); + + ck_assert(linkedlist_size(list) == 2); + + get = linkedlist_get(&list, 1); + + ck_assert(linkedlist_size(list) == 2); + + ck_assert(*get == value2); + + linkedlist_destroy(&list); + + ck_assert(list == NULL); +} +END_TEST + Suite* t_suite_create() { Suite *s; @@ -127,6 +155,7 @@ Suite* t_suite_create() tcase_add_test(tc_core, test_linkedlist_pop); tcase_add_test(tc_core, test_linkedlist_append); tcase_add_test(tc_core, test_linkedlist_poplast); + tcase_add_test(tc_core, test_linkedlist_get_index); suite_add_tcase(s, tc_core); return s; diff --git a/linkedlist/linkedlist.c b/linkedlist/linkedlist.c index 05c36c7..c8a7450 100644 --- a/linkedlist/linkedlist.c +++ b/linkedlist/linkedlist.c @@ -93,6 +93,16 @@ void* linkedlist_poplast(LinkedList **head) return linkedlist_poplast(&nextNode); } +void* linkedlist_get(LinkedList **head, unsigned int index) +{ + if (*head == NULL) + return NULL; + if (index == 0) + return (*head)->data; + + return linkedlist_get(&(*head)->next, --index); +} + void linkedlist_destroy(LinkedList **head) { if (*head == NULL) { diff --git a/linkedlist/linkedlist.h b/linkedlist/linkedlist.h index 86268c2..cab9f7f 100644 --- a/linkedlist/linkedlist.h +++ b/linkedlist/linkedlist.h @@ -17,6 +17,8 @@ void linkedlist_append(LinkedList **head, void *value, unsigned int size); void* linkedlist_poplast(LinkedList **head); +void* linkedlist_get(LinkedList **head, unsigned int index); + void linkedlist_destroy(LinkedList **head); unsigned int linkedlist_size(LinkedList *head); diff --git a/src/map.c b/src/map.c index 35a013e..edbb8f6 100644 --- a/src/map.c +++ b/src/map.c @@ -1,16 +1,6 @@ #include "map.h" #include "util.h" -static -Sprite* create_default_tile(SDL_Renderer *renderer) -{ - Sprite *s = sprite_create(); - sprite_load_texture(s, "assets/Objects/Floor.png", renderer); - s->texture->clip = (SDL_Rect) { 16, 54, 16, 16 }; - s->texture->dim = (Dimension) { 64, 64 }; - return s; -} - static Room* create_room() { @@ -31,9 +21,9 @@ Map* map_create(SDL_Renderer *renderer) int i, j; Map *map = ec_malloc(sizeof(Map)); + map->textures = linkedlist_create(); map->currentRoom = (Position) { 0, 0 }; map->level = 1; - map->defaultTile = create_default_tile(renderer); for (i=0; i < MAP_V_ROOM_COUNT; ++i) { for (j=0; j < MAP_H_ROOM_COUNT; ++j) { @@ -44,6 +34,13 @@ Map* map_create(SDL_Renderer *renderer) return map; } +static +void map_tile_render(Map *map, MapTile *tile, Position *pos, Camera *cam) +{ + if (tile == NULL) + return; +} + void map_render(Map *map, Camera *cam) { int i, j; @@ -53,16 +50,11 @@ void map_render(Map *map, Camera *cam) roomPos.x * MAP_ROOM_WIDTH * 64, roomPos.y * MAP_ROOM_HEIGHT * 64 }; - Sprite *dTile = map->defaultTile; room = map->rooms[roomPos.x][roomPos.y]; for (i=0; i < MAP_ROOM_HEIGHT; ++i) { for (j=0; j < MAP_ROOM_WIDTH; ++j) { - if (room->tiles[i][j] == NULL) { - dTile->pos.x = roomCords.x + (64*j); - dTile->pos.y = roomCords.y + (64*i); - sprite_render(dTile, cam); - } + map_tile_render(map, room->tiles[i][j], &roomCords, cam); } } } @@ -74,7 +66,7 @@ void map_room_destroy(Room *room) for (i=0; i < MAP_ROOM_HEIGHT; ++i) { for (j=0; j < MAP_ROOM_WIDTH; ++j) { if (room->tiles[i][j]) { - sprite_destroy(room->tiles[i][j]); + free(room->tiles[i][j]); } } } @@ -89,5 +81,8 @@ void map_destroy(Map *map) map_room_destroy(map->rooms[i][j]); } } + while (map->textures != NULL) { + SDL_DestroyTexture(linkedlist_poplast(&map->textures)); + } free(map); } diff --git a/src/map.h b/src/map.h index fdd7710..efbbb73 100644 --- a/src/map.h +++ b/src/map.h @@ -6,6 +6,7 @@ #include "sprite.h" #include "camera.h" +#include "position.h" #define MAP_ROOM_HEIGHT 12 #define MAP_ROOM_WIDTH 16 @@ -13,13 +14,18 @@ #define MAP_H_ROOM_COUNT 10 typedef struct { - Sprite* tiles[MAP_ROOM_HEIGHT][MAP_ROOM_WIDTH]; + unsigned int textureIndex; + Position clipPosition; +} MapTile; + +typedef struct { + MapTile* tiles[MAP_ROOM_HEIGHT][MAP_ROOM_WIDTH]; } Room; typedef struct { Room* rooms[MAP_V_ROOM_COUNT][MAP_H_ROOM_COUNT]; + LinkedList *textures; Position currentRoom; - Sprite* defaultTile; int level; } Map;