summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/raylib.rb18
-rw-r--r--src/raylib.c178
2 files changed, 134 insertions, 62 deletions
diff --git a/mrblib/raylib.rb b/mrblib/raylib.rb
index be2bf65..a75f795 100644
--- a/mrblib/raylib.rb
+++ b/mrblib/raylib.rb
@@ -26,6 +26,7 @@ module Raylib
self.vector.y = y
end
end
+
class << self
attr_accessor :defined_loop
attr_accessor :data_keys_pressed
@@ -68,12 +69,25 @@ module Raylib
return self.data_keys_pressed
end
self.data_keys_pressed = []
- key = self._key_pressed
+ key = self._next_key_pressed
while key != 0
self.data_keys_pressed.push key
- key = self._key_pressed
+ key = self._next_key_pressed
end
self.data_keys_pressed
end
+
+ def scissor_mode(x: x, y: y, width: width, height: height, &block)
+ self.begin_scissor_mode(x, y, width, height)
+ yield
+ self.end_scissor_mode
+ end
+
+ def draw(clear_color: nil, &block)
+ self.clear_background(clear_color) if clear_color
+ self.begin_drawing
+ yield
+ self.end_drawing
+ end
end
end
diff --git a/src/raylib.c b/src/raylib.c
index 0396e42..c66a303 100644
--- a/src/raylib.c
+++ b/src/raylib.c
@@ -31,10 +31,10 @@ static const struct mrb_data_type Rectangle_type = {
static mrb_value
mrb_Rectangle_initialize(mrb_state* mrb, mrb_value self) {
- mrb_float x = 0.0;
- mrb_float y = 0.0;
- mrb_float w = 10.0;
- mrb_float h = 10.0;
+ mrb_float x = 0.0;
+ mrb_float y = 0.0;
+ mrb_float w = 10.0;
+ mrb_float h = 10.0;
mrb_get_args(mrb, "|ffff", &x, &y, &w, &h);
Rectangle *rectangle = (Rectangle *)DATA_PTR(self);
@@ -62,7 +62,7 @@ mrb_Rectangle_set_x(mrb_state* mrb, mrb_value self) {
Rectangle *rect = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle);
mrb_float x;
mrb_get_args(mrb, "f", &x);
- rect->x = x;
+ rect->x = x;
return mrb_fixnum_value(rect->x);
}
@@ -77,7 +77,7 @@ mrb_Rectangle_set_y(mrb_state* mrb, mrb_value self) {
Rectangle *rect = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle);
mrb_float y;
mrb_get_args(mrb, "f", &y);
- rect->x = y;
+ rect->x = y;
return mrb_fixnum_value(rect->y);
}
@@ -92,7 +92,7 @@ mrb_Rectangle_set_width(mrb_state* mrb, mrb_value self) {
Rectangle *rect = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle);
mrb_float width;
mrb_get_args(mrb, "f", &width);
- rect->x = width;
+ rect->x = width;
return mrb_fixnum_value(rect->width);
}
@@ -101,7 +101,7 @@ mrb_Rectangle_set_height(mrb_state* mrb, mrb_value self) {
Rectangle *rect = DATA_GET_PTR(mrb, self, &Rectangle_type, Rectangle);
mrb_float height;
mrb_get_args(mrb, "f", &height);
- rect->x = height;
+ rect->x = height;
return mrb_fixnum_value(rect->height);
}
@@ -113,8 +113,8 @@ mrb_Rectangle_get_height(mrb_state* mrb, mrb_value self) {
static mrb_value
mrb_Vector2_initialize(mrb_state* mrb, mrb_value self) {
- mrb_float x = 1.0;
- mrb_float y = 1.0;
+ mrb_float x = 1.0;
+ mrb_float y = 1.0;
mrb_get_args(mrb, "|ff", &x, &y);
Vector2 *vector2 = (Vector2 *)DATA_PTR(self);
@@ -140,7 +140,7 @@ mrb_Vector2_set_x(mrb_state* mrb, mrb_value self) {
Vector2 *vec2 = DATA_GET_PTR(mrb, self, &Vector2_type, Vector2);
mrb_float x;
mrb_get_args(mrb, "f", &x);
- vec2->x = x;
+ vec2->x = x;
return mrb_fixnum_value(vec2->x);
}
@@ -155,7 +155,7 @@ mrb_Vector2_set_y(mrb_state* mrb, mrb_value self) {
Vector2 *vec2 = DATA_GET_PTR(mrb, self, &Vector2_type, Vector2);
mrb_float y;
mrb_get_args(mrb, "f", &y);
- vec2->y = y;
+ vec2->y = y;
return mrb_fixnum_value(vec2->y);
}
@@ -186,7 +186,7 @@ mrb_Texture_set_width(mrb_state* mrb, mrb_value self) {
Texture *texture = DATA_GET_PTR(mrb, self, &Texture_type, Texture);
mrb_int width;
mrb_get_args(mrb, "i", &width);
- texture->width = width;
+ texture->width = width;
return mrb_fixnum_value(texture->width);
}
@@ -201,7 +201,7 @@ mrb_Texture_set_height(mrb_state* mrb, mrb_value self) {
Texture *texture = DATA_GET_PTR(mrb, self, &Texture_type, Texture);
mrb_int height;
mrb_get_args(mrb, "i", &height);
- texture->height = height;
+ texture->height = height;
return mrb_fixnum_value(texture->height);
}
@@ -243,13 +243,13 @@ static mrb_value
mrb_draw_texture_ex(mrb_state* mrb, mrb_value self) {
mrb_value texture_obj;
mrb_value pos_obj;
- mrb_float rotation;
- mrb_float scale;
- mrb_value tint_obj;
+ mrb_float rotation;
+ mrb_float scale;
+ mrb_value tint_obj;
mrb_get_args(mrb, "ooffo", &texture_obj, &pos_obj, &rotation, &scale, &tint_obj);
Texture *texture_data = DATA_GET_PTR(mrb, texture_obj, &Texture_type, Texture);
- Vector2 *pos_data = DATA_GET_PTR(mrb, pos_obj, &Vector2_type, Vector2);
+ Vector2 *pos_data = DATA_GET_PTR(mrb, pos_obj, &Vector2_type, Vector2);
Color *tint_data = DATA_GET_PTR(mrb, tint_obj, &Color_type, Color);
DrawTextureEx(*texture_data, *pos_data, rotation, scale, *tint_data);
@@ -263,14 +263,14 @@ mrb_draw_texture_pro(mrb_state* mrb, mrb_value self) {
mrb_value pos_obj;
mrb_value source_rect_obj;
mrb_value dest_rect_obj;
- mrb_float rotation;
- mrb_value tint_obj;
+ mrb_float rotation;
+ mrb_value tint_obj;
mrb_get_args(mrb, "oooofo", &texture_obj, &pos_obj, &source_rect_obj, &dest_rect_obj, &rotation, &tint_obj);
Texture *texture_data = DATA_GET_PTR(mrb, texture_obj, &Texture_type, Texture);
- Vector2 *pos_data = DATA_GET_PTR(mrb, pos_obj, &Vector2_type, Vector2);
- Rectangle *source_rect_data = DATA_GET_PTR(mrb, source_rect_obj, &Rectangle_type, Rectangle);
- Rectangle *dest_rect_data = DATA_GET_PTR(mrb, dest_rect_obj, &Rectangle_type, Rectangle);
+ Vector2 *pos_data = DATA_GET_PTR(mrb, pos_obj, &Vector2_type, Vector2);
+ Rectangle *source_rect_data = DATA_GET_PTR(mrb, source_rect_obj, &Rectangle_type, Rectangle);
+ Rectangle *dest_rect_data = DATA_GET_PTR(mrb, dest_rect_obj, &Rectangle_type, Rectangle);
Color *tint_data = DATA_GET_PTR(mrb, tint_obj, &Color_type, Color);
DrawTexturePro(*texture_data, *source_rect_data, *dest_rect_data, *pos_data, rotation, *tint_data);
@@ -279,6 +279,24 @@ mrb_draw_texture_pro(mrb_state* mrb, mrb_value self) {
}
static mrb_value
+mrb_begin_scissor_mode(mrb_state* mrb, mrb_value self) {
+ mrb_int x;
+ mrb_int y;
+ mrb_int width;
+ mrb_int height;
+ mrb_get_args(mrb, "iiii", &x, &y, &width, &height);
+
+ BeginScissorMode(x, y, width, height);
+ return mrb_nil_value();
+}
+
+static mrb_value
+mrb_end_scissor_mode(mrb_state* mrb, mrb_value self) {
+ EndScissorMode();
+ return mrb_nil_value();
+}
+
+static mrb_value
mrb_Color_initialize(mrb_state* mrb, mrb_value self) {
mrb_int r = 255;
mrb_int g = 0;
@@ -366,6 +384,38 @@ mrb_Color_set_alpha(mrb_state* mrb, mrb_value self) {
}
static mrb_value
+mrb_is_mouse_button_pressed(mrb_state* mrb, mrb_value self) {
+ mrb_int button;
+ mrb_get_args(mrb, "i", &button);
+
+ return mrb_bool_value(IsMouseButtonPressed(button));
+}
+
+static mrb_value
+mrb_is_mouse_button_down(mrb_state* mrb, mrb_value self) {
+ mrb_int button;
+ mrb_get_args(mrb, "i", &button);
+
+ return mrb_bool_value(IsMouseButtonDown(button));
+}
+
+static mrb_value
+mrb_is_mouse_button_released(mrb_state* mrb, mrb_value self) {
+ mrb_int button;
+ mrb_get_args(mrb, "i", &button);
+
+ return mrb_bool_value(IsMouseButtonReleased(button));
+}
+
+static mrb_value
+mrb_is_mouse_button_up(mrb_state* mrb, mrb_value self) {
+ mrb_int button;
+ mrb_get_args(mrb, "i", &button);
+
+ return mrb_bool_value(IsMouseButtonUp(button));
+}
+
+static mrb_value
mrb_is_key_pressed(mrb_state* mrb, mrb_value self) {
mrb_int key;
mrb_get_args(mrb, "i", &key);
@@ -450,7 +500,7 @@ mrb_draw_text(mrb_state* mrb, mrb_value self) {
mrb_get_args(mrb, "|ziiio", &text, &x, &y, &fontSize, &color_obj);
- Color *color = DATA_GET_PTR(mrb, color_obj, &Color_type, Color);
+ Color *color = DATA_GET_PTR(mrb, color_obj, &Color_type, Color);
DrawText(text, x, y, fontSize, *color);
return mrb_nil_value();
}
@@ -469,7 +519,10 @@ mrb_end_drawing(mrb_state* mrb, mrb_value self) {
static mrb_value
mrb_clear_background(mrb_state* mrb, mrb_value self) {
- ClearBackground(RAYWHITE);
+ mrb_value color_obj;
+ mrb_get_args(mrb, "o", &color_obj);
+ Color *color_data = DATA_GET_PTR(mrb, color_obj, &Color_type, Color);
+ ClearBackground(*color_data);
return mrb_nil_value();
}
@@ -525,16 +578,16 @@ 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));
+ 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));
- return mrb_bool_value(CheckCollisionCircles(*center1, radius1, *center2, radius2));
+ 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
@@ -542,36 +595,36 @@ 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);
+ 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));
+ 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));
+ 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));
+ 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
@@ -582,7 +635,7 @@ mrb_mruby_raylib_gem_init(mrb_state* mrb) {
mrb_define_class_method(mrb, raylib, "_draw_text", mrb_draw_text, MRB_ARGS_REQ(5));
mrb_define_class_method(mrb, raylib, "begin_drawing", mrb_begin_drawing, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "end_drawing", mrb_end_drawing, MRB_ARGS_NONE());
- mrb_define_class_method(mrb, raylib, "clear_background", mrb_clear_background, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, raylib, "clear_background", mrb_clear_background, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, raylib, "call_main_loop", mrb_call_main_loop, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "window_should_close?", mrb_window_should_close, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "target_fps=", mrb_target_fps, MRB_ARGS_REQ(1));
@@ -592,14 +645,20 @@ mrb_mruby_raylib_gem_init(mrb_state* mrb) {
mrb_define_class_method(mrb, raylib, "_draw_texture", mrb_draw_texture, MRB_ARGS_REQ(4));
mrb_define_class_method(mrb, raylib, "_draw_texture_ex", mrb_draw_texture_ex, MRB_ARGS_REQ(5));
mrb_define_class_method(mrb, raylib, "_draw_texture_pro", mrb_draw_texture_pro, MRB_ARGS_REQ(6));
- mrb_define_class_method(mrb, raylib, "is_key_pressed?", mrb_is_key_pressed, MRB_ARGS_REQ(1));
- mrb_define_class_method(mrb, raylib, "is_key_down?", mrb_is_key_down, MRB_ARGS_REQ(1));
- mrb_define_class_method(mrb, raylib, "is_key_released?", mrb_is_key_released, MRB_ARGS_REQ(1));
- mrb_define_class_method(mrb, raylib, "is_key_up?", mrb_is_key_up, MRB_ARGS_REQ(1));
- mrb_define_class_method(mrb, raylib, "_key_pressed", mrb_get_key_pressed, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, raylib, "mouse_button_pressed?", mrb_is_mouse_button_pressed, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "mouse_button_down?", mrb_is_mouse_button_down, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "mouse_button_released?", mrb_is_mouse_button_released, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "mouse_button_up?", mrb_is_mouse_button_up, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "key_pressed?", mrb_is_key_pressed, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "key_down?", mrb_is_key_down, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "key_released?", mrb_is_key_released, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "key_up?", mrb_is_key_up, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, raylib, "_next_key_pressed", mrb_get_key_pressed, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "mouse_x", mrb_get_mouse_x, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "mouse_y", mrb_get_mouse_y, MRB_ARGS_NONE());
mrb_define_class_method(mrb, raylib, "mouse_wheel", mrb_get_mouse_wheel_move, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, raylib, "begin_scissor_mode", mrb_begin_scissor_mode, MRB_ARGS_REQ(4));
+ mrb_define_class_method(mrb, raylib, "end_scissor_mode", mrb_end_scissor_mode, MRB_ARGS_NONE());
struct RClass *color_class = mrb_define_class_under(mrb, raylib, "Color", mrb->object_class);
MRB_SET_INSTANCE_TT(color_class, MRB_TT_DATA);
@@ -651,13 +710,12 @@ 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));
-
+ 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));
+ //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());