diff options
| author | arngo <[email protected]> | 2022-01-21 01:24:18 -0500 |
|---|---|---|
| committer | arngo <[email protected]> | 2022-01-21 01:24:18 -0500 |
| commit | 128fab6823e2569837d9e14549bb5817577a2ce0 (patch) | |
| tree | 412d0c6a6fcaee7e192f3e5f5c51dee6f0ebfa72 /src | |
| parent | dc203ce664367fec050f7ad4f37076160d10d2a4 (diff) | |
| download | mruby-raylib-128fab6823e2569837d9e14549bb5817577a2ce0.tar.gz mruby-raylib-128fab6823e2569837d9e14549bb5817577a2ce0.zip | |
Circle class and circle-rectangle collision methods
Diffstat (limited to 'src')
| -rw-r--r-- | src/raylib.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/raylib.c b/src/raylib.c index 7e41b4b..0396e42 100644 --- a/src/raylib.c +++ b/src/raylib.c @@ -3,6 +3,7 @@ #include <mruby/array.h> #include <mruby/data.h> #include <mruby/class.h> +#include <mruby/numeric.h> #include <stdlib.h> #if defined(PLATFORM_WEB) #include <emscripten/emscripten.h> @@ -520,6 +521,59 @@ mrb_time(mrb_state* mrb, mrb_value self) { return mrb_float_value(mrb, GetTime()); } +static mrb_value +mrb_Circle_collide_with_circ(mrb_state* mrb, mrb_value self) { + mrb_value circle_obj; + mrb_get_args(mrb, "o", &circle_obj); + + mrb_value vector_obj1 = mrb_funcall(mrb, self, "vector", 0); + Vector2 *center1 = DATA_GET_PTR(mrb, vector_obj1, &Vector2_type, Vector2); + mrb_float radius1 = mrb_as_float(mrb, mrb_funcall(mrb, self, "radius", 0)); + + mrb_value vector_obj2 = mrb_funcall(mrb, circle_obj, "vector", 0); + Vector2 *center2 = DATA_GET_PTR(mrb, vector_obj2, &Vector2_type, Vector2); + mrb_float radius2 = mrb_as_float(mrb, mrb_funcall(mrb, circle_obj, "radius", 0)); + + return mrb_bool_value(CheckCollisionCircles(*center1, radius1, *center2, radius2)); +} + +static mrb_value +mrb_Rectangle_collide_with_rec(mrb_state* mrb, mrb_value self) { + mrb_value rec1_obj; + mrb_get_args(mrb, "o", &rec1_obj); + + Rectangle *rec1 = DATA_GET_PTR(mrb, rec1_obj, &Rectangle_type, Rectangle); + Rectangle *rec2 = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle); + + return mrb_bool_value(CheckCollisionRecs(*rec1, *rec2)); +} + +static mrb_value +mrb_Rectangle_collide_with_circ(mrb_state* mrb, mrb_value self) { + mrb_value circle_obj; + mrb_get_args(mrb, "o", &circle_obj); + + mrb_value vector_obj = mrb_funcall(mrb, circle_obj, "vector", 0); + mrb_float radius = mrb_as_float(mrb, mrb_funcall(mrb, circle_obj, "radius", 0)); + Rectangle *rec = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle); + Vector2 *center = DATA_GET_PTR(mrb, vector_obj, &Vector2_type, Vector2); + + return mrb_bool_value(CheckCollisionCircleRec(*center, radius, *rec)); +} + +static mrb_value +mrb_Circle_collide_with_rec(mrb_state* mrb, mrb_value self) { + mrb_value rect_obj; + mrb_get_args(mrb, "o", &rect_obj); + + mrb_value vector_obj = mrb_funcall(mrb, self, "vector", 0); + mrb_float radius = mrb_as_float(mrb, mrb_funcall(mrb, self, "radius", 0)); + Rectangle *rec = DATA_GET_PTR(mrb, rect_obj, &Rectangle_type, Rectangle); + Vector2 *center = DATA_GET_PTR(mrb, vector_obj, &Vector2_type, Vector2); + + return mrb_bool_value(CheckCollisionCircleRec(*center, radius, *rec)); +} + void mrb_mruby_raylib_gem_init(mrb_state* mrb) { struct RClass *raylib = mrb_define_module(mrb, "Raylib"); @@ -597,6 +651,13 @@ mrb_mruby_raylib_gem_init(mrb_state* mrb) { mrb_define_method(mrb, rectangle_class, "height=", mrb_Rectangle_set_height, MRB_ARGS_REQ(1)); mrb_define_method(mrb, rectangle_class, "h", mrb_Rectangle_get_height, MRB_ARGS_NONE()); mrb_define_method(mrb, rectangle_class, "h=", mrb_Rectangle_set_height, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, rectangle_class, "collide_with_rect?", mrb_Rectangle_collide_with_rec, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, rectangle_class, "collide_with_circle?", mrb_Rectangle_collide_with_circ, MRB_ARGS_REQ(1)); + + struct RClass *circle_class = mrb_define_class_under(mrb, raylib, "Circle", mrb->object_class); + //struct RClass *circle_class = mrb_class_get_under(mrb, raylib, "Circle"); + mrb_define_method(mrb, circle_class, "collide_with_rect?", mrb_Circle_collide_with_rec, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, circle_class, "collide_with_circle?", mrb_Circle_collide_with_circ, MRB_ARGS_REQ(1)); #if defined(PLATFORM_WEB) mrb_define_class_method(mrb, raylib, "emscripten_set_main_loop", mrb_emscripten_set_main_loop, MRB_ARGS_NONE()); |
