diff options
| author | arngo <[email protected]> | 2023-05-25 21:26:37 -0400 |
|---|---|---|
| committer | arngo <[email protected]> | 2023-05-25 21:26:37 -0400 |
| commit | ccadd3c51a7040532fe26cf185140b05a2bdcbe4 (patch) | |
| tree | 9932f70c7a6760a23c874b4a4afd3b5b814d4386 | |
| parent | 030ae6b44015005401589eb9b3b055cb10bd7285 (diff) | |
| download | RodeoKit-ccadd3c51a7040532fe26cf185140b05a2bdcbe4.tar.gz RodeoKit-ccadd3c51a7040532fe26cf185140b05a2bdcbe4.zip | |
implemented 2d collision system
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | include/rodeo/collision.h | 24 | ||||
| -rw-r--r-- | include/rodeo/collision_t.h | 2 | ||||
| -rw-r--r-- | src/collision/rodeo_collision.c | 117 |
4 files changed, 139 insertions, 5 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cd566d..cccc4de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(${PROJECT_NAME} "src/log/rodeo_log.c" "src/input/rodeo_input.c" "src/audio/rodeo_audio.c" + "src/collision/rodeo_collision.c" ) set_property(TARGET RodeoKit PROPERTY C_STANDARD 99) diff --git a/include/rodeo/collision.h b/include/rodeo/collision.h index 9e7b856..a8ec07f 100644 --- a/include/rodeo/collision.h +++ b/include/rodeo/collision.h @@ -7,7 +7,9 @@ rodeo_collision_2d_world_t rodeo_collision_2d_world_create(void); void -rodeo_collision_2d_world_destroy(void); +rodeo_collision_2d_world_destroy( + rodeo_collision_2d_world_t *world +); cvec_collision_2d_world_item_value* rodeo_collision_2d_world_item_create( @@ -21,15 +23,27 @@ rodeo_collision_2d_world_item_destroy( cvec_collision_2d_world_item_value* cvec_value ); +rodeo_collision_2d_world_item_t* +rodeo_collision_2d_world_item_get_by_id( + rodeo_collision_2d_world_t *world, + uint32_t id +); + void rodeo_collision_2d_world_compare_self( - rodeo_collision_2d_world_t *world - // resolve function? + rodeo_collision_2d_world_t *world, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) ); void rodeo_collision_2d_world_compare_other( rodeo_collision_2d_world_t *world_a, - rodeo_collision_2d_world_t *world_b - // resolve function? + rodeo_collision_2d_world_t *world_b, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) ); diff --git a/include/rodeo/collision_t.h b/include/rodeo/collision_t.h index e51386c..19f5dbe 100644 --- a/include/rodeo/collision_t.h +++ b/include/rodeo/collision_t.h @@ -18,6 +18,7 @@ struct } rodeo_collision_2d_world_item_t; + int rodeo_collision_2d_item_cmp( const rodeo_collision_2d_world_item_t* a, const rodeo_collision_2d_world_item_t* b @@ -28,4 +29,5 @@ int rodeo_collision_2d_item_cmp( #define i_type cvec_collision_2d_world_item #include "stc/cvec.h" + typedef cvec_collision_2d_world_item rodeo_collision_2d_world_t; diff --git a/src/collision/rodeo_collision.c b/src/collision/rodeo_collision.c new file mode 100644 index 0000000..8119fb9 --- /dev/null +++ b/src/collision/rodeo_collision.c @@ -0,0 +1,117 @@ +#include "rodeo/collision.h" +#include "rodeo/collision_t.h" +#include <stdio.h> + +bool detect_collision( + const rodeo_collision_2d_world_item_t *a, + const rodeo_collision_2d_world_item_t *b +) +{ + return !(a->x+a->dx > b->x+b->dx + b->width || + b->x+b->dx > a->x+a->dx + a->width || + a->y+a->dy > b->y+b->dy + b->height || + b->y+b->dy > a->y+a->dy + a->height); +} + +rodeo_collision_2d_world_t +rodeo_collision_2d_world_create(void) +{ + return cvec_collision_2d_world_item_init(); +} + +void +rodeo_collision_2d_world_destroy( +rodeo_collision_2d_world_t *world +) +{ + cvec_collision_2d_world_item_drop(world); +} + +cvec_collision_2d_world_item_value* +rodeo_collision_2d_world_item_create( + rodeo_collision_2d_world_t *world, + rodeo_collision_2d_world_item_t item_params +) +{ + static uint32_t next_id = 0; + item_params.id = next_id++; + cvec_collision_2d_world_item_value* new_item = cvec_collision_2d_world_item_push(world, item_params); + + return new_item; +} + +void +rodeo_collision_2d_world_item_destroy( + rodeo_collision_2d_world_t *world, + cvec_collision_2d_world_item_value* cvec_value +) +{ + cvec_collision_2d_world_item_value temp = *cvec_collision_2d_world_item_back(world); + *cvec_collision_2d_world_item_back(world) = *cvec_value; + *cvec_value = temp; + cvec_collision_2d_world_item_pop(world); +} + +rodeo_collision_2d_world_item_t* +rodeo_collision_2d_world_item_get_by_id( + rodeo_collision_2d_world_t *world, + uint32_t id +) +{ + c_foreach(i, cvec_collision_2d_world_item, *world) { + if (i.ref->id == id) { + return i.ref; + } + } + return NULL; +} + +void +rodeo_collision_2d_world_compare_self( + rodeo_collision_2d_world_t *world, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) +) +{ + c_foreach(i, cvec_collision_2d_world_item, *world) { + c_foreach(j, cvec_collision_2d_world_item, cvec_collision_2d_world_item_advance(i, 1), cvec_collision_2d_world_item_end(world)) { + if (detect_collision(i.ref, j.ref)) { + resolve(i.ref, j.ref); + } + } + } +} + +void +rodeo_collision_2d_world_compare_other( + rodeo_collision_2d_world_t *world_a, + rodeo_collision_2d_world_t *world_b, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) +) +{ + c_foreach(i, cvec_collision_2d_world_item, *world_a) { + c_foreach(j, cvec_collision_2d_world_item, *world_b) { + if (detect_collision(i.ref, j.ref)) { + resolve(i.ref, j.ref); + } + } + } +} + + +int rodeo_collision_2d_item_cmp( + const rodeo_collision_2d_world_item_t* a, + const rodeo_collision_2d_world_item_t* b +) +{ + if (a->id == b->id) { + return 0; + } else { + return a->id > b->id ? 1 : -1; + } +} |
