diff options
| author | arngo <[email protected]> | 2022-01-18 18:36:01 -0500 |
|---|---|---|
| committer | arngo <[email protected]> | 2022-01-18 18:36:01 -0500 |
| commit | 37101bf5f1ea8d65d13348aec171fadf8850a46e (patch) | |
| tree | be62f9e03811b17ca5feb6cdda5b76b7576e52dc | |
| parent | cfd787b4f8c8684b626f2cd612e4336a2d3b4978 (diff) | |
| download | mruby-raylib-37101bf5f1ea8d65d13348aec171fadf8850a46e.tar.gz mruby-raylib-37101bf5f1ea8d65d13348aec171fadf8850a46e.zip | |
web and desktop main loop
| -rw-r--r-- | mrblib/raylib.rb | 22 | ||||
| -rw-r--r-- | src/raylib.c | 147 |
2 files changed, 94 insertions, 75 deletions
diff --git a/mrblib/raylib.rb b/mrblib/raylib.rb index 5fd1ad7..0f542c9 100644 --- a/mrblib/raylib.rb +++ b/mrblib/raylib.rb @@ -1,12 +1,20 @@ module Raylib - #attr_accessor :main_loop + class << self + attr_accessor :main_loop - #def call_main_loop - # self.main_loop.call - #end + def while_window_open(&block) + self.main_loop = block + if Raylib.platform == 'desktop' + while !Raylib.window_should_close? do + self.main_loop.call + end + elsif Raylib.platform == 'web' + Raylib.emscripten_set_main_loop + end + end - def self.window_open(&block) - self.main_loop = block - self.execute_main_loop + def test + puts 'hello' + end end end diff --git a/src/raylib.c b/src/raylib.c index 23d75ac..9ef3be5 100644 --- a/src/raylib.c +++ b/src/raylib.c @@ -5,117 +5,128 @@ #include <emscripten/emscripten.h> #endif -void call_main_loop(); +#if defined(PLATFORM_WEB) +void Execute_Emscripten_Block(void*); +#endif - static mrb_value + static mrb_value mrb_init_window(mrb_state *mrb, mrb_value self) { - mrb_int screenWidth = 800; - mrb_int screenHeight = 600; - char* title = "Hello World from FelFlame!"; - mrb_get_args(mrb, "|iiz", &screenWidth, &screenHeight, &title); + printf("1\n"); + mrb_int screenWidth = 800; + printf("2\n"); + mrb_int screenHeight = 600; + printf("3\n"); + char* title = "Hello World from FelFlame!"; + printf("4\n"); + mrb_get_args(mrb, "|iiz", &screenWidth, &screenHeight, &title); + printf("5\n"); - InitWindow(screenWidth, screenHeight, title); + InitWindow(screenWidth, screenHeight, title); + printf("6\n"); - return mrb_nil_value(); + return mrb_nil_value(); } - static mrb_value + static mrb_value mrb_platform(mrb_state *mrb, mrb_value self) { -#ifdef defined(PLATFORM_WEB) - return mrb_str_new_lit(mrb, "web"); +#if defined(PLATFORM_WEB) + return mrb_str_new_lit(mrb, "web"); #else - return mrb_str_new_lit(mrb, "desktop"); + return mrb_str_new_lit(mrb, "desktop"); #endif } //void DrawText(const char *text, int posX, int posY, int fontSize, Color color); - static mrb_value + static mrb_value mrb_draw_text(mrb_state *mrb, mrb_value self) { - char* text = "Default Text"; - mrb_int x = 0; - mrb_int y = 0; - mrb_int fontSize = 16; - //mrb_value color = mrb_ary_new(mrb); - //mrb_int temp = 200; - //mrb_int temp2 = 255; + char* text = "Default Text"; + mrb_int x = 0; + mrb_int y = 0; + mrb_int fontSize = 16; + //mrb_value color = mrb_ary_new(mrb); + //mrb_int temp = 200; + //mrb_int temp2 = 255; //mrb_ary_push(mrb, color, temp); - //mrb_ary_push(mrb, color, temp); - //mrb_ary_push(mrb, color, temp); - //mrb_ary_push(mrb, color, temp2); - mrb_get_args(mrb, "|ziii", &text, &x, &y, &fontSize); - //mrb_value mrb_ary_ref(mrb_state *, mrb_value, mrb_int) - //Color result_color = (Color){mrb_ary_ref(mrb,color,0),mrb_ary_ref(mrb,color,1),mrb_ary_ref(mrb,color,2),mrb_ary_ref(mrb,color,3),}; - DrawText(text, x, y, fontSize, RED); - return mrb_nil_value(); + //mrb_ary_push(mrb, color, temp); + //mrb_ary_push(mrb, color, temp); + //mrb_ary_push(mrb, color, temp2); + mrb_get_args(mrb, "|ziii", &text, &x, &y, &fontSize); + //mrb_value mrb_ary_ref(mrb_state *, mrb_value, mrb_int) + //Color result_color = (Color){mrb_ary_ref(mrb,color,0),mrb_ary_ref(mrb,color,1),mrb_ary_ref(mrb,color,2),mrb_ary_ref(mrb,color,3),}; + DrawText(text, x, y, fontSize, RED); + return mrb_nil_value(); } - static mrb_value + static mrb_value mrb_begin_drawing(mrb_state *mrb, mrb_value self) { - BeginDrawing(); - return mrb_nil_value(); + BeginDrawing(); + return mrb_nil_value(); } - static mrb_value + static mrb_value mrb_end_drawing(mrb_state *mrb, mrb_value self) { - EndDrawing(); - return mrb_nil_value(); + EndDrawing(); + return mrb_nil_value(); } static mrb_value mrb_clear_background(mrb_state *mrb, mrb_value self) { - ClearBackground(RAYWHITE); - return mrb_nil_value(); + ClearBackground(RAYWHITE); + return mrb_nil_value(); } - void -call_main_loop() + static mrb_value +mrb_call_main_loop(mrb_state *mrb, mrb_value self) { - mrb_state *mrb = mrb_open(); - if (!mrb) {} - printf("test"); - struct RClass *c = mrb_class_get(mrb, "Raylib"); - printf("test2"); - mrb_value main_loop = mrb_funcall(mrb, mrb_obj_value(c), "main_loop", 0); - mrb_funcall(mrb, main_loop, "call", 0); + struct RClass *c = mrb_module_get(mrb, "Raylib"); + mrb_value ml = mrb_funcall(mrb, mrb_obj_value(c), "main_loop", 0); + return mrb_funcall(mrb, ml, "call", 0); +} + +static mrb_value +mrb_window_should_close(mrb_state *mrb, mrb_value self) { + return mrb_obj_value(WindowShouldClose()); } - static mrb_value -mrb_execute_main_loop(mrb_state *mrb, mrb_value self) -{ #if defined(PLATFORM_WEB) - emscripten_set_main_loop(call_main_loop, 0, 1); -#else - SetTargetFPS(60); // Set our game to run at 60 frames-per-second - //-------------------------------------------------------------------------------------- +static mrb_value +mrb_emscripten_set_main_loop(mrb_state *mrb, mrb_value self) { + emscripten_set_main_loop_arg(Execute_Emscripten_Block, mrb, 0, 1); +} - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - call_main_loop(); - } -#endif - return mrb_nil_value(); + void +Execute_Emscripten_Block(void *mrb) +{ + struct RClass *c = mrb_module_get(mrb, "Raylib"); + mrb_value ml = mrb_funcall(mrb, mrb_obj_value(c), "main_loop", 0); + mrb_funcall(mrb, ml, "call", 0); } +#endif void mrb_mruby_raylib_gem_init(mrb_state* mrb) { - struct RClass *raylib = mrb_define_module(mrb, "Raylib"); - mrb_define_class_method(mrb, raylib, "init_window", mrb_init_window, MRB_ARGS_REQ(3)); - mrb_define_class_method(mrb, raylib, "platform", mrb_platform, MRB_ARGS_NONE()); - mrb_define_class_method(mrb, raylib, "draw_text", mrb_draw_text, MRB_ARGS_REQ(4)); - 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, "execute_main_loop", mrb_execute_main_loop, MRB_ARGS_NONE()); + struct RClass *raylib = mrb_define_module(mrb, "Raylib"); + mrb_define_class_method(mrb, raylib, "init_window", mrb_init_window, MRB_ARGS_REQ(3)); + mrb_define_class_method(mrb, raylib, "platform", mrb_platform, MRB_ARGS_NONE()); + mrb_define_class_method(mrb, raylib, "draw_text", mrb_draw_text, MRB_ARGS_REQ(4)); + 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, "execute_main_loop", mrb_execute_main_loop, MRB_ARGS_NONE()); + 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()); +#if defined(PLATFORM_WEB) + mrb_define_class_method(mrb, raylib, "emscripten_set_main_loop", mrb_emscripten_set_main_loop, MRB_ARGS_NONE()); +#endif } void mrb_mruby_raylib_gem_final(mrb_state* mrb) { - /* finalizer */ + /* finalizer */ } |
