From cbdef8b3b99a3a95d2347317bdec4dc77fc20da8 Mon Sep 17 00:00:00 2001 From: Michael Fitzmayer Date: Thu, 10 Mar 2022 21:58:27 +0100 Subject: [PATCH] Add basic collision detection, it's not perfect but it works --- res/entry.tmj | 266 ++++++++++++++++++++++++++++++++++++++++++-------- src/core.c | 77 ++++++++++++++- 2 files changed, 295 insertions(+), 48 deletions(-) diff --git a/res/entry.tmj b/res/entry.tmj index 5389cc7..7d6a396 100644 --- a/res/entry.tmj +++ b/res/entry.tmj @@ -154,6 +154,24 @@ "tilecount":832, "tileheight":16, "tiles":[ + { + "id":8, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":10, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, { "id":11, "properties":[ @@ -1585,6 +1603,15 @@ "value":true }] }, + { + "id":340, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, { "id":341, "properties":[ @@ -1685,7 +1712,7 @@ }] }, { - "id":375, + "id":370, "properties":[ { "name":"is_solid", @@ -1694,7 +1721,7 @@ }] }, { - "id":392, + "id":373, "properties":[ { "name":"is_solid", @@ -1703,7 +1730,7 @@ }] }, { - "id":393, + "id":374, "properties":[ { "name":"is_solid", @@ -1712,25 +1739,7 @@ }] }, { - "id":394, - "properties":[ - { - "name":"is_solid", - "type":"bool", - "value":true - }] - }, - { - "id":395, - "properties":[ - { - "name":"is_solid", - "type":"bool", - "value":true - }] - }, - { - "id":396, + "id":375, "properties":[ { "name":"is_solid", @@ -1739,7 +1748,7 @@ }] }, { - "id":397, + "id":392, "properties":[ { "name":"is_solid", @@ -1748,7 +1757,7 @@ }] }, { - "id":398, + "id":393, "properties":[ { "name":"is_solid", @@ -1757,7 +1766,7 @@ }] }, { - "id":399, + "id":394, "properties":[ { "name":"is_solid", @@ -1766,7 +1775,7 @@ }] }, { - "id":408, + "id":395, "properties":[ { "name":"is_solid", @@ -1775,7 +1784,7 @@ }] }, { - "id":409, + "id":396, "properties":[ { "name":"is_solid", @@ -1784,7 +1793,7 @@ }] }, { - "id":411, + "id":397, "properties":[ { "name":"is_solid", @@ -1793,7 +1802,7 @@ }] }, { - "id":412, + "id":398, "properties":[ { "name":"is_solid", @@ -1802,7 +1811,7 @@ }] }, { - "id":413, + "id":399, "properties":[ { "name":"is_solid", @@ -1811,7 +1820,7 @@ }] }, { - "id":414, + "id":408, "properties":[ { "name":"is_solid", @@ -1820,7 +1829,7 @@ }] }, { - "id":415, + "id":409, "properties":[ { "name":"is_solid", @@ -1829,7 +1838,7 @@ }] }, { - "id":418, + "id":411, "properties":[ { "name":"is_solid", @@ -1838,7 +1847,7 @@ }] }, { - "id":419, + "id":412, "properties":[ { "name":"is_solid", @@ -1847,7 +1856,7 @@ }] }, { - "id":420, + "id":413, "properties":[ { "name":"is_solid", @@ -1856,7 +1865,7 @@ }] }, { - "id":421, + "id":414, "properties":[ { "name":"is_solid", @@ -1865,7 +1874,7 @@ }] }, { - "id":422, + "id":415, "properties":[ { "name":"is_solid", @@ -1874,7 +1883,7 @@ }] }, { - "id":423, + "id":418, "properties":[ { "name":"is_solid", @@ -1883,7 +1892,7 @@ }] }, { - "id":424, + "id":419, "properties":[ { "name":"is_solid", @@ -1892,7 +1901,7 @@ }] }, { - "id":428, + "id":420, "properties":[ { "name":"is_solid", @@ -1901,7 +1910,7 @@ }] }, { - "id":429, + "id":421, "properties":[ { "name":"is_solid", @@ -1910,7 +1919,7 @@ }] }, { - "id":430, + "id":422, "properties":[ { "name":"is_solid", @@ -1919,7 +1928,7 @@ }] }, { - "id":431, + "id":423, "properties":[ { "name":"is_solid", @@ -2638,6 +2647,24 @@ "value":true }] }, + { + "id":680, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":684, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, { "id":688, "properties":[ @@ -2665,6 +2692,42 @@ "value":true }] }, + { + "id":696, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":697, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":699, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":700, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, { "id":708, "properties":[ @@ -2701,6 +2764,51 @@ "value":true }] }, + { + "id":712, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":713, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":714, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":715, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":716, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, { "id":723, "properties":[ @@ -2754,6 +2862,78 @@ "type":"bool", "value":true }] + }, + { + "id":747, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":748, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":750, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":751, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":779, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":780, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":782, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] + }, + { + "id":783, + "properties":[ + { + "name":"is_solid", + "type":"bool", + "value":true + }] }], "tilewidth":16, "transparentcolor":"#ff00ff" diff --git a/src/core.c b/src/core.c index 28bd768..87d8fe5 100644 --- a/src/core.c +++ b/src/core.c @@ -101,6 +101,69 @@ static void update_camera(core_t* core) } } +static void move_actor(actor_t* actor, Sint32 offset_x, Sint32 offset_y, core_t* core) +{ + Sint32 tile_index; + Sint32 adjacent_tile; + + if (! is_map_loaded(core)) + { + return; + } + + tile_index = get_tile_index(actor->pos_x, actor->pos_y, core); + + // Moves right. + if (offset_x > 0) + { + adjacent_tile = tile_index + 1; + if (! core->map->tile_desc[adjacent_tile].is_solid) + { + actor->pos_x += offset_x; + } + } + // Moves left. + else if (offset_x < 0) + { + adjacent_tile = tile_index - 1; + if (! core->map->tile_desc[adjacent_tile].is_solid) + { + actor->pos_x += offset_x; + } + } + + // Moves down. + if (offset_y > 0) + { + adjacent_tile = tile_index + core->map->handle->width; + if (adjacent_tile >= core->map->tile_desc_count) + { + adjacent_tile = core->map->tile_desc_count - 1; + } + + if (! core->map->tile_desc[adjacent_tile].is_solid) + { + actor->pos_y += offset_y; + } + } + // Moves up. + else if (offset_y < 0) + { + adjacent_tile = tile_index - core->map->handle->width; + if (adjacent_tile >= 0) + { + if (! core->map->tile_desc[adjacent_tile].is_solid) + { + actor->pos_y += offset_y; + } + } + else + { + actor->pos_y += offset_y; + } + } +} + status_t init_core(const char* resource_file, const char* title, core_t** core) { status_t status = CORE_OK; @@ -162,7 +225,7 @@ status_t update_core(core_t* core) if (! is_map_loaded(core)) { - return; + return status; } core->time_b = core->time_a; @@ -190,25 +253,29 @@ status_t update_core(core_t* core) { core->map->actor[target_index].show_animation = SDL_TRUE; core->map->actor[target_index].animation.offset_y = 3; - core->map->actor[target_index].pos_y -= 2; + + move_actor(&core->map->actor[target_index], 0, -2, core); } if (keystate[SDL_SCANCODE_DOWN]) { core->map->actor[target_index].show_animation = SDL_TRUE; core->map->actor[target_index].animation.offset_y = 0; - core->map->actor[target_index].pos_y += 2; + + move_actor(&core->map->actor[target_index], 0, 2, core); } if (keystate[SDL_SCANCODE_LEFT]) { core->map->actor[target_index].show_animation = SDL_TRUE; core->map->actor[target_index].animation.offset_y = 1; - core->map->actor[target_index].pos_x -= 2; + + move_actor(&core->map->actor[target_index], -2, 0, core); } if (keystate[SDL_SCANCODE_RIGHT]) { core->map->actor[target_index].show_animation = SDL_TRUE; core->map->actor[target_index].animation.offset_y = 2; - core->map->actor[target_index].pos_x += 2; + + move_actor(&core->map->actor[target_index], 2, 0, core); } if (SDL_PollEvent(&event))