ruby2d 0.12.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.md +7 -0
- data/README.md +141 -0
- data/USAGE.md +2435 -0
- data/assets/Rakefile +637 -0
- data/assets/build_support/CMakeLists.txt +94 -0
- data/assets/build_support/mruby/build_config.rb +34 -0
- data/assets/build_support/mruby/build_config_wasm.rb +30 -0
- data/assets/build_support/sdl_test.c +174 -0
- data/assets/deps.yaml +16 -0
- data/assets/platform/include/SDL3/SDL.h +91 -0
- data/assets/platform/include/SDL3/SDL_assert.h +705 -0
- data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
- data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
- data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
- data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
- data/assets/platform/include/SDL3/SDL_camera.h +535 -0
- data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
- data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
- data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
- data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
- data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
- data/assets/platform/include/SDL3/SDL_endian.h +645 -0
- data/assets/platform/include/SDL3/SDL_error.h +226 -0
- data/assets/platform/include/SDL3/SDL_events.h +1645 -0
- data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
- data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
- data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
- data/assets/platform/include/SDL3/SDL_guid.h +106 -0
- data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
- data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
- data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
- data/assets/platform/include/SDL3/SDL_init.h +507 -0
- data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
- data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
- data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
- data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
- data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
- data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
- data/assets/platform/include/SDL3/SDL_log.h +541 -0
- data/assets/platform/include/SDL3/SDL_main.h +704 -0
- data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
- data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
- data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
- data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
- data/assets/platform/include/SDL3/SDL_pen.h +198 -0
- data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
- data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
- data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
- data/assets/platform/include/SDL3/SDL_process.h +441 -0
- data/assets/platform/include/SDL3/SDL_properties.h +572 -0
- data/assets/platform/include/SDL3/SDL_rect.h +528 -0
- data/assets/platform/include/SDL3/SDL_render.h +3028 -0
- data/assets/platform/include/SDL3/SDL_revision.h +59 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
- data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
- data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
- data/assets/platform/include/SDL3/SDL_storage.h +686 -0
- data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
- data/assets/platform/include/SDL3/SDL_system.h +840 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
- data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
- data/assets/platform/include/SDL3/SDL_thread.h +602 -0
- data/assets/platform/include/SDL3/SDL_time.h +249 -0
- data/assets/platform/include/SDL3/SDL_timer.h +454 -0
- data/assets/platform/include/SDL3/SDL_touch.h +184 -0
- data/assets/platform/include/SDL3/SDL_tray.h +544 -0
- data/assets/platform/include/SDL3/SDL_version.h +198 -0
- data/assets/platform/include/SDL3/SDL_video.h +3497 -0
- data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
- data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
- data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
- data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
- data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
- data/assets/{include → platform/include}/mrbconf.h +42 -31
- data/assets/{include → platform/include}/mruby/array.h +3 -4
- data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
- data/assets/platform/include/mruby/boxing_no.h +59 -0
- data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
- data/assets/platform/include/mruby/class.h +157 -0
- data/assets/{include → platform/include}/mruby/common.h +30 -1
- data/assets/{include → platform/include}/mruby/compile.h +52 -74
- data/assets/{include → platform/include}/mruby/data.h +2 -2
- data/assets/{include → platform/include}/mruby/debug.h +12 -5
- data/assets/{include → platform/include}/mruby/dump.h +7 -9
- data/assets/{include → platform/include}/mruby/endian.h +1 -1
- data/assets/platform/include/mruby/error.h +173 -0
- data/assets/platform/include/mruby/gc.h +79 -0
- data/assets/{include → platform/include}/mruby/hash.h +1 -7
- data/assets/platform/include/mruby/internal.h +282 -0
- data/assets/platform/include/mruby/irep.h +143 -0
- data/assets/{include → platform/include}/mruby/istruct.h +1 -1
- data/assets/platform/include/mruby/khash.h +455 -0
- data/assets/platform/include/mruby/mempool.h +19 -0
- data/assets/{include → platform/include}/mruby/numeric.h +7 -10
- data/assets/platform/include/mruby/object.h +51 -0
- data/assets/{include → platform/include}/mruby/opcode.h +5 -5
- data/assets/{include → platform/include}/mruby/ops.h +19 -6
- data/assets/platform/include/mruby/presym/id.h +1447 -0
- data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
- data/assets/platform/include/mruby/presym/table.h +2893 -0
- data/assets/platform/include/mruby/presym.h +65 -0
- data/assets/platform/include/mruby/proc.h +184 -0
- data/assets/{include → platform/include}/mruby/range.h +0 -2
- data/assets/{include → platform/include}/mruby/string.h +33 -53
- data/assets/platform/include/mruby/throw.h +81 -0
- data/assets/{include → platform/include}/mruby/value.h +64 -29
- data/assets/{include → platform/include}/mruby/variable.h +6 -23
- data/assets/{include → platform/include}/mruby/version.h +7 -7
- data/assets/{include → platform/include}/mruby.h +238 -116
- data/assets/platform/macos-arm64/bin/mrbc +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libFLAC.a +0 -0
- data/assets/platform/wasm/lib/libSDL3.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/wasm/lib/libfreetype.a +0 -0
- data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
- data/assets/platform/wasm/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libogg.a +0 -0
- data/assets/platform/wasm/lib/libplutosvg.a +0 -0
- data/assets/platform/wasm/lib/libplutovg.a +0 -0
- data/assets/platform/wasm/lib/libpng.a +0 -0
- data/assets/platform/wasm/lib/libpng16.a +0 -0
- data/assets/platform/wasm/lib/libvorbis.a +0 -0
- data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
- data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/resources/fonts/outfit/OFL.txt +93 -0
- data/assets/resources/fonts/outfit/outfit.ttf +0 -0
- data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
- data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
- data/assets/resources/icons/icon.icns +0 -0
- data/assets/resources/icons/icon.png +0 -0
- data/assets/resources/spritesheets/License.txt +28 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
- data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
- data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
- data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
- data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
- data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
- data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
- data/assets/{wasm → resources/web}/template.html +1 -1
- data/assets/target.rb +131 -0
- data/bin/ruby2d +281 -82
- data/examples/astar.rb +269 -0
- data/examples/asteroids.rb +403 -0
- data/examples/bezier_editor.rb +96 -0
- data/examples/boids.rb +191 -0
- data/examples/bouncing_balls.rb +119 -0
- data/examples/breakout.rb +186 -0
- data/examples/constellations.rb +100 -0
- data/examples/dashboard.rb +133 -0
- data/examples/double_pendulum.rb +254 -0
- data/examples/falling_sand.rb +291 -0
- data/examples/fireworks.rb +110 -0
- data/examples/fluid_dynamics.rb +340 -0
- data/examples/fourier_epicycles.rb +142 -0
- data/examples/fractal_tree.rb +326 -0
- data/examples/game_of_life.rb +148 -0
- data/examples/gamepads.rb +333 -0
- data/examples/hill_driver.rb +613 -0
- data/examples/logo_animation.rb +251 -0
- data/examples/lorenz_attractor.rb +115 -0
- data/examples/mandelbrot.rb +207 -0
- data/examples/marching_squares.rb +200 -0
- data/examples/maze.rb +323 -0
- data/examples/nbody.rb +338 -0
- data/examples/outrun.rb +391 -0
- data/examples/pixel_paint.rb +313 -0
- data/examples/platformer.rb +335 -0
- data/examples/ray_casting_maze.rb +175 -0
- data/examples/shadow_casting.rb +151 -0
- data/examples/shape_recognizer.rb +908 -0
- data/examples/snake.rb +144 -0
- data/examples/sprite_sheets.rb +246 -0
- data/examples/swarm.rb +206 -0
- data/examples/tsp_annealing.rb +104 -0
- data/examples/ui_controls.rb +163 -0
- data/examples/wireframe_3d.rb +139 -0
- data/ext/ruby2d/audio.c +324 -0
- data/ext/ruby2d/canvas.c +1715 -494
- data/ext/ruby2d/ext.c +541 -0
- data/ext/ruby2d/extconf.rb +122 -145
- data/ext/ruby2d/font.c +566 -20
- data/ext/ruby2d/fps.c +92 -0
- data/ext/ruby2d/image.c +466 -41
- data/ext/ruby2d/ruby2d.c +374 -1890
- data/ext/ruby2d/ruby2d.h +840 -460
- data/ext/ruby2d/shapes.c +931 -101
- data/ext/ruby2d/text.c +586 -21
- data/ext/ruby2d/window.c +1693 -283
- data/lib/ruby2d/atlas_parser.rb +194 -0
- data/lib/ruby2d/audio.rb +73 -0
- data/lib/ruby2d/benchmark.rb +259 -0
- data/lib/ruby2d/bitmap_text.rb +155 -0
- data/lib/ruby2d/button.rb +402 -0
- data/lib/ruby2d/canvas.rb +703 -279
- data/lib/ruby2d/circle.rb +206 -29
- data/lib/ruby2d/cli/browser.rb +314 -0
- data/lib/ruby2d/cli/build.rb +471 -257
- data/lib/ruby2d/cli/colorize.rb +7 -5
- data/lib/ruby2d/cli/examples.rb +127 -0
- data/lib/ruby2d/cli/launch.rb +24 -39
- data/lib/ruby2d/cli/lib_files.rb +48 -0
- data/lib/ruby2d/cli/messages.rb +40 -0
- data/lib/ruby2d/cli/setup.rb +273 -0
- data/lib/ruby2d/cli/static_server.rb +160 -0
- data/lib/ruby2d/cli/usage.rb +255 -0
- data/lib/ruby2d/color.rb +191 -69
- data/lib/ruby2d/core.rb +37 -19
- data/lib/ruby2d/deps_help.rb +89 -0
- data/lib/ruby2d/dsl.rb +51 -12
- data/lib/ruby2d/ellipse.rb +228 -0
- data/lib/ruby2d/exceptions.rb +0 -2
- data/lib/ruby2d/font.rb +34 -74
- data/lib/ruby2d/gamepad.rb +323 -0
- data/lib/ruby2d/gem_paths.rb +19 -0
- data/lib/ruby2d/image.rb +155 -52
- data/lib/ruby2d/interactive.rb +103 -0
- data/lib/ruby2d/json_parser.rb +268 -0
- data/lib/ruby2d/line.rb +194 -85
- data/lib/ruby2d/mruby_compat.rb +12 -0
- data/lib/ruby2d/polygon.rb +297 -0
- data/lib/ruby2d/polyline.rb +368 -0
- data/lib/ruby2d/quad.rb +358 -94
- data/lib/ruby2d/rectangle.rb +77 -19
- data/lib/ruby2d/renderable.rb +411 -11
- data/lib/ruby2d/sprite.rb +471 -180
- data/lib/ruby2d/sprite_sheet.rb +64 -0
- data/lib/ruby2d/square.rb +29 -17
- data/lib/ruby2d/text.rb +196 -65
- data/lib/ruby2d/tileset.rb +139 -81
- data/lib/ruby2d/triangle.rb +324 -89
- data/lib/ruby2d/version.rb +1 -3
- data/lib/ruby2d/vertices.rb +62 -85
- data/lib/ruby2d/warnings.rb +29 -0
- data/lib/ruby2d/window/class_methods.rb +218 -0
- data/lib/ruby2d/window/gamepad_events.rb +141 -0
- data/lib/ruby2d/window/key_events.rb +74 -0
- data/lib/ruby2d/window/mouse_events.rb +171 -0
- data/lib/ruby2d/window/object_events.rb +168 -0
- data/lib/ruby2d/window.rb +632 -585
- data/lib/ruby2d.rb +14 -19
- metadata +275 -428
- data/assets/app.icns +0 -0
- data/assets/include/GLES2/gl2.h +0 -656
- data/assets/include/GLES2/gl2ext.h +0 -3949
- data/assets/include/GLES2/gl2ext_angle.h +0 -701
- data/assets/include/GLES2/gl2platform.h +0 -27
- data/assets/include/GLES3/gl3.h +0 -1192
- data/assets/include/GLES3/gl31.h +0 -1507
- data/assets/include/GLES3/gl32.h +0 -1808
- data/assets/include/GLES3/gl3platform.h +0 -27
- data/assets/include/KHR/khrplatform.h +0 -290
- data/assets/include/SDL2/SDL.h +0 -233
- data/assets/include/SDL2/SDL_assert.h +0 -326
- data/assets/include/SDL2/SDL_atomic.h +0 -415
- data/assets/include/SDL2/SDL_audio.h +0 -1500
- data/assets/include/SDL2/SDL_clipboard.h +0 -141
- data/assets/include/SDL2/SDL_config.h +0 -61
- data/assets/include/SDL2/SDL_config_android.h +0 -194
- data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
- data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
- data/assets/include/SDL2/SDL_config_macosx.h +0 -277
- data/assets/include/SDL2/SDL_config_minimal.h +0 -95
- data/assets/include/SDL2/SDL_config_ngage.h +0 -89
- data/assets/include/SDL2/SDL_config_os2.h +0 -207
- data/assets/include/SDL2/SDL_config_pandora.h +0 -141
- data/assets/include/SDL2/SDL_config_windows.h +0 -331
- data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
- data/assets/include/SDL2/SDL_config_winrt.h +0 -220
- data/assets/include/SDL2/SDL_config_xbox.h +0 -235
- data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
- data/assets/include/SDL2/SDL_endian.h +0 -348
- data/assets/include/SDL2/SDL_error.h +0 -163
- data/assets/include/SDL2/SDL_events.h +0 -1166
- data/assets/include/SDL2/SDL_filesystem.h +0 -149
- data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
- data/assets/include/SDL2/SDL_gesture.h +0 -117
- data/assets/include/SDL2/SDL_guid.h +0 -100
- data/assets/include/SDL2/SDL_haptic.h +0 -1341
- data/assets/include/SDL2/SDL_hidapi.h +0 -451
- data/assets/include/SDL2/SDL_hints.h +0 -2569
- data/assets/include/SDL2/SDL_image.h +0 -2173
- data/assets/include/SDL2/SDL_joystick.h +0 -1066
- data/assets/include/SDL2/SDL_keyboard.h +0 -353
- data/assets/include/SDL2/SDL_keycode.h +0 -358
- data/assets/include/SDL2/SDL_loadso.h +0 -115
- data/assets/include/SDL2/SDL_log.h +0 -404
- data/assets/include/SDL2/SDL_main.h +0 -275
- data/assets/include/SDL2/SDL_mixer.h +0 -2784
- data/assets/include/SDL2/SDL_mouse.h +0 -465
- data/assets/include/SDL2/SDL_mutex.h +0 -471
- data/assets/include/SDL2/SDL_name.h +0 -33
- data/assets/include/SDL2/SDL_pixels.h +0 -644
- data/assets/include/SDL2/SDL_platform.h +0 -261
- data/assets/include/SDL2/SDL_quit.h +0 -58
- data/assets/include/SDL2/SDL_rect.h +0 -376
- data/assets/include/SDL2/SDL_render.h +0 -1919
- data/assets/include/SDL2/SDL_revision.h +0 -6
- data/assets/include/SDL2/SDL_rwops.h +0 -841
- data/assets/include/SDL2/SDL_sensor.h +0 -322
- data/assets/include/SDL2/SDL_shape.h +0 -155
- data/assets/include/SDL2/SDL_stdinc.h +0 -830
- data/assets/include/SDL2/SDL_surface.h +0 -997
- data/assets/include/SDL2/SDL_system.h +0 -623
- data/assets/include/SDL2/SDL_syswm.h +0 -386
- data/assets/include/SDL2/SDL_test_images.h +0 -78
- data/assets/include/SDL2/SDL_test_random.h +0 -115
- data/assets/include/SDL2/SDL_thread.h +0 -464
- data/assets/include/SDL2/SDL_timer.h +0 -222
- data/assets/include/SDL2/SDL_touch.h +0 -150
- data/assets/include/SDL2/SDL_ttf.h +0 -2316
- data/assets/include/SDL2/SDL_types.h +0 -29
- data/assets/include/SDL2/SDL_version.h +0 -204
- data/assets/include/SDL2/SDL_video.h +0 -2150
- data/assets/include/SDL2/SDL_vulkan.h +0 -215
- data/assets/include/SDL2/begin_code.h +0 -187
- data/assets/include/mruby/boxing_no.h +0 -58
- data/assets/include/mruby/class.h +0 -108
- data/assets/include/mruby/error.h +0 -147
- data/assets/include/mruby/gc.h +0 -94
- data/assets/include/mruby/irep.h +0 -147
- data/assets/include/mruby/khash.h +0 -284
- data/assets/include/mruby/object.h +0 -43
- data/assets/include/mruby/presym/disable.h +0 -70
- data/assets/include/mruby/presym/enable.h +0 -37
- data/assets/include/mruby/presym.h +0 -40
- data/assets/include/mruby/proc.h +0 -211
- data/assets/include/mruby/throw.h +0 -66
- data/assets/macos/universal/bin/mrbc +0 -0
- data/assets/macos/universal/lib/libFLAC.a +0 -0
- data/assets/macos/universal/lib/libSDL2.a +0 -0
- data/assets/macos/universal/lib/libSDL2_image.a +0 -0
- data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/universal/lib/libavif.a +0 -0
- data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
- data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
- data/assets/macos/universal/lib/libfreetype.a +0 -0
- data/assets/macos/universal/lib/libgraphite2.a +0 -0
- data/assets/macos/universal/lib/libharfbuzz.a +0 -0
- data/assets/macos/universal/lib/libhwy.a +0 -0
- data/assets/macos/universal/lib/libjpeg.a +0 -0
- data/assets/macos/universal/lib/libjxl.a +0 -0
- data/assets/macos/universal/lib/libmodplug.a +0 -0
- data/assets/macos/universal/lib/libmpg123.a +0 -0
- data/assets/macos/universal/lib/libmruby.a +0 -0
- data/assets/macos/universal/lib/libogg.a +0 -0
- data/assets/macos/universal/lib/libpng.a +0 -0
- data/assets/macos/universal/lib/libtiff.a +0 -0
- data/assets/macos/universal/lib/libvorbis.a +0 -0
- data/assets/macos/universal/lib/libvorbisfile.a +0 -0
- data/assets/macos/universal/lib/libwebp.a +0 -0
- data/assets/macos/universal/lib/libzstd.a +0 -0
- data/assets/test_media/README.md +0 -3
- data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
- data/assets/test_media/bitstream_vera/vera.ttf +0 -0
- data/assets/test_media/boom.png +0 -0
- data/assets/test_media/coin.png +0 -0
- data/assets/test_media/colors.png +0 -0
- data/assets/test_media/controller.png +0 -0
- data/assets/test_media/dial.wav +0 -0
- data/assets/test_media/hero.png +0 -0
- data/assets/test_media/image.bmp +0 -0
- data/assets/test_media/image.jpg +0 -0
- data/assets/test_media/image.png +0 -0
- data/assets/test_media/music.flac +0 -0
- data/assets/test_media/music.mp3 +0 -0
- data/assets/test_media/music.ogg +0 -0
- data/assets/test_media/music.wav +0 -0
- data/assets/test_media/originals/boom.pxm +0 -0
- data/assets/test_media/originals/coin.pxm +0 -0
- data/assets/test_media/originals/controller.sketch +0 -0
- data/assets/test_media/originals/hero.pxm +0 -0
- data/assets/test_media/originals/image.pxm +0 -0
- data/assets/test_media/originals/music.caf +0 -0
- data/assets/test_media/originals/texture_atlas.pxm +0 -0
- data/assets/test_media/rondo_alla_turka.ogg +0 -0
- data/assets/test_media/sound.flac +0 -0
- data/assets/test_media/sound.mp3 +0 -0
- data/assets/test_media/sound.ogg +0 -0
- data/assets/test_media/sound.wav +0 -0
- data/assets/test_media/sprite_sheet.png +0 -0
- data/assets/test_media/texture_atlas.png +0 -0
- data/assets/wasm/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
- data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
- data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
- data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
- data/assets/xcode/ios/Info.plist +0 -43
- data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
- data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/ios/main.c +0 -1
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
- data/assets/xcode/tvos/Info.plist +0 -30
- data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
- data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/tvos/main.c +0 -1
- data/ext/ruby2d/common.c +0 -185
- data/ext/ruby2d/controllers.c +0 -110
- data/ext/ruby2d/gl.c +0 -398
- data/ext/ruby2d/gl2.c +0 -86
- data/ext/ruby2d/gl3.c +0 -304
- data/ext/ruby2d/gles.c +0 -302
- data/ext/ruby2d/input.c +0 -48
- data/ext/ruby2d/music.c +0 -127
- data/ext/ruby2d/sound.c +0 -132
- data/lib/ruby2d/cli/console.rb +0 -65
- data/lib/ruby2d/cli/enable_console.rb +0 -7
- data/lib/ruby2d/cli/platform.rb +0 -17
- data/lib/ruby2d/music.rb +0 -77
- data/lib/ruby2d/pixel.rb +0 -18
- data/lib/ruby2d/pixmap.rb +0 -39
- data/lib/ruby2d/pixmap_atlas.rb +0 -56
- data/lib/ruby2d/sound.rb +0 -61
- data/lib/ruby2d/texture.rb +0 -38
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
- /data/assets/{include → platform/include}/mruby/re.h +0 -0
data/bin/ruby2d
CHANGED
|
@@ -8,97 +8,181 @@ require 'ruby2d/version'
|
|
|
8
8
|
|
|
9
9
|
# Usage ########################################################################
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
[-v|--version]
|
|
11
|
+
r = "\e[38;2;246;60;56m"
|
|
12
|
+
x = "\e[0m"
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
usage = "
|
|
15
|
+
#{r} ◆#{x}
|
|
16
|
+
#{r} ◆ ◆#{x} #{'Ruby 2D'.ruby2d_red.bold} #{('v' + Ruby2D::VERSION).dim}
|
|
17
|
+
#{r} ◆ ◆#{x}
|
|
18
|
+
#{r} ◆ ◆#{x} Make 2D applications with Ruby
|
|
19
|
+
#{r} ◆#{x}
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
#{'Commands:'.bold}
|
|
22
|
+
build Build a Ruby source file
|
|
23
|
+
launch Launch a built Ruby 2D application
|
|
24
|
+
setup Build the native libraries (SDL3 + mruby) for your platform
|
|
25
|
+
usage Browse the Ruby 2D usage guide by section
|
|
26
|
+
examples Browse and run the bundled example apps
|
|
27
|
+
agents Print the usage guide for AI coding agents
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
#{'Options:'.bold}
|
|
30
|
+
-h, --help Show this help (or use after a command for its help)
|
|
31
|
+
-v, --version Print the installed version
|
|
27
32
|
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
#{'ruby2d.com'.dim}
|
|
34
|
+
\n"
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
usage_build = "
|
|
37
|
+
Use the #{'build'.bold} command to compile or build Ruby 2D apps.
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
build --ios <ruby_file>
|
|
36
|
-
build --tvos <ruby_file>
|
|
39
|
+
Usage: ruby2d build [options] <ruby_file>
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
Targets:
|
|
42
|
+
--native Build a native executable only
|
|
43
|
+
--web Build for the web with WebAssembly only
|
|
44
|
+
(default) Build for all platforms
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
Options:
|
|
47
|
+
--assets <dir> Bundle a directory of media files (native and web)
|
|
48
|
+
--template <file> Use a custom HTML template for the web build (web only)
|
|
49
|
+
--single-file Produce a single self-contained HTML file (web only)
|
|
50
|
+
--debug Print debugging info and keep intermediate files
|
|
51
|
+
--clean Clean up the build directory
|
|
43
52
|
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
An app can bundle its own asset directories without the --assets flag by
|
|
54
|
+
declaring them in its source: #{'# ruby2d:assets <dir>'.bold} (one per line).\n\n"
|
|
46
55
|
|
|
47
56
|
usage_launch = "
|
|
48
57
|
Use the #{'launch'.bold} command to run a Ruby 2D app that has been built.
|
|
49
58
|
Choose one of the following options to select the kind of app to run:
|
|
50
59
|
|
|
51
60
|
--native
|
|
52
|
-
--web
|
|
53
|
-
|
|
54
|
-
|
|
61
|
+
--web\n\n"
|
|
62
|
+
|
|
63
|
+
usage_setup = "
|
|
64
|
+
Use the #{'setup'.bold} command to build Ruby 2D's native libraries (SDL3 and
|
|
65
|
+
mruby) for your platform, so you can compile native apps with #{'ruby2d build'.bold}.
|
|
66
|
+
|
|
67
|
+
The gem bundles these for common platforms; run #{'setup'.bold} when yours isn't
|
|
68
|
+
bundled (e.g. Linux or Intel macOS). It needs git, CMake, and a C compiler (on
|
|
69
|
+
Linux, also pkg-config and X11 or Wayland dev libraries), and builds into a
|
|
70
|
+
per-user cache outside the gem.
|
|
71
|
+
|
|
72
|
+
It prints what it's about to do and asks before starting.
|
|
55
73
|
|
|
56
|
-
|
|
57
|
-
Choose an option with the #{'simulator'.bold} command:
|
|
74
|
+
Usage: ruby2d setup [options]
|
|
58
75
|
|
|
59
|
-
|
|
60
|
-
--
|
|
76
|
+
Options:
|
|
77
|
+
--force Rebuild even if the libraries already exist
|
|
78
|
+
--clean Remove the built libraries for this platform
|
|
79
|
+
-y, --yes Skip the confirmation prompt\n\n"
|
|
61
80
|
|
|
62
|
-
|
|
81
|
+
usage_usage = "
|
|
82
|
+
Use the #{'usage'.bold} command to browse the Ruby 2D usage guide by section.
|
|
63
83
|
|
|
64
|
-
|
|
65
|
-
to the app e.g. \"Release-iphonesimulator/MyApp.app\"
|
|
84
|
+
Usage: ruby2d usage [<name|number>|list|all]
|
|
66
85
|
|
|
67
|
-
|
|
68
|
-
|
|
86
|
+
(no args) Open the interactive browser
|
|
87
|
+
<name> View a section by name (e.g. shapes)
|
|
88
|
+
<number> View a section by its number in the list
|
|
89
|
+
list Print the full list and exit
|
|
90
|
+
all View the entire guide\n\n"
|
|
69
91
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
92
|
+
usage_examples = "
|
|
93
|
+
Use the #{'examples'.bold} command to browse and run the bundled example apps.
|
|
94
|
+
|
|
95
|
+
Usage: ruby2d examples [<name|number>|list|source <name>]
|
|
96
|
+
|
|
97
|
+
(no args) Open the interactive browser
|
|
98
|
+
<name> Run an example by file name (e.g. snake)
|
|
99
|
+
<number> Run an example by its number in the list
|
|
100
|
+
list Print the full list and exit
|
|
101
|
+
source <name> Print the source of an example\n\n"
|
|
73
102
|
|
|
74
103
|
# Check Command-line Arguments #################################################
|
|
75
104
|
|
|
76
105
|
case ARGV[0]
|
|
77
|
-
when 'console'
|
|
78
|
-
require 'ruby2d/cli/console'
|
|
79
106
|
when 'build'
|
|
80
107
|
require 'ruby2d/cli/build'
|
|
81
108
|
if ARGV.delete '--debug' then @debug = true end
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
109
|
+
if ARGV.delete '--single-file' then @single_file = true end
|
|
110
|
+
if idx = ARGV.index('--assets')
|
|
111
|
+
value = ARGV[idx + 1]
|
|
112
|
+
# `--assets DIR` takes a directory. Without a valid one (missing, another
|
|
113
|
+
# flag, or — the common slip — the source file), fail loud instead of
|
|
114
|
+
# silently swallowing the next token (e.g. the .rb to build).
|
|
115
|
+
if value.nil? || value.start_with?('-') || !Dir.exist?(value)
|
|
116
|
+
puts "#{'Error:'.error} --assets requires a directory path"
|
|
117
|
+
exit 1
|
|
118
|
+
end
|
|
119
|
+
ARGV.delete_at(idx) # remove '--assets'
|
|
120
|
+
ARGV.delete_at(idx) # remove the directory value (now shifted into idx)
|
|
121
|
+
@assets_dir = value
|
|
122
|
+
end
|
|
123
|
+
if idx = ARGV.index('--template')
|
|
124
|
+
value = ARGV[idx + 1]
|
|
125
|
+
# `--template FILE` takes an HTML file. Without a valid one (missing, another
|
|
126
|
+
# flag, or the source file slipped in), fail loud rather than swallow the
|
|
127
|
+
# next token — same contract as `--assets`.
|
|
128
|
+
if value.nil? || value.start_with?('-') || !File.file?(value)
|
|
129
|
+
puts "#{'Error:'.error} --template requires an HTML file path"
|
|
130
|
+
exit 1
|
|
131
|
+
end
|
|
132
|
+
ARGV.delete_at(idx) # remove '--template'
|
|
133
|
+
ARGV.delete_at(idx) # remove the file value (now shifted into idx)
|
|
134
|
+
@template = value
|
|
135
|
+
end
|
|
136
|
+
# Target flags are position-independent: `build app.rb --native` honors
|
|
137
|
+
# --native the same as `build --native app.rb`.
|
|
138
|
+
native = ARGV.delete('--native')
|
|
139
|
+
web = ARGV.delete('--web')
|
|
140
|
+
# Whether web was requested explicitly (vs. implied by the all-platforms
|
|
141
|
+
# default), so a missing `emcc` fails loudly for `--web` but skips quietly otherwise.
|
|
142
|
+
@web_explicit = !web.nil?
|
|
143
|
+
if ARGV.delete('--help') || ARGV.delete('-h')
|
|
144
|
+
puts usage_build
|
|
145
|
+
elsif ARGV.delete('--clean')
|
|
146
|
+
# `--clean` is standalone: it only empties the build directory. Warn if it
|
|
147
|
+
# was combined with build arguments so the skipped build isn't silent.
|
|
148
|
+
leftover = (ARGV[1..] || []).reject { |a| a.start_with?('-') }
|
|
149
|
+
if native || web || !leftover.empty?
|
|
150
|
+
puts "#{'Note:'.bold} `--clean` only cleans the build directory; other build arguments were ignored."
|
|
151
|
+
end
|
|
99
152
|
clean_up(:all)
|
|
100
153
|
else
|
|
101
|
-
|
|
154
|
+
targets = if native && !web then :native
|
|
155
|
+
elsif web && !native then :web
|
|
156
|
+
else [:native, :web]
|
|
157
|
+
end
|
|
158
|
+
# `--template`/`--single-file` are web-only; reject them on a native-only
|
|
159
|
+
# build instead of silently dropping the request. (`--assets` bundles for
|
|
160
|
+
# both native and web, so it's allowed here.)
|
|
161
|
+
if targets == :native
|
|
162
|
+
offenders = []
|
|
163
|
+
offenders << '--template' if @template
|
|
164
|
+
offenders << '--single-file' if @single_file
|
|
165
|
+
unless offenders.empty?
|
|
166
|
+
verb = offenders.size == 1 ? 'is' : 'are'
|
|
167
|
+
puts "#{'Error:'.error} #{offenders.join(' and ')} #{verb} web-only and can't be used with --native"
|
|
168
|
+
puts usage_build
|
|
169
|
+
exit 1
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
# Everything after `build`; the known flags were deleted above, so any
|
|
173
|
+
# remaining `-`-prefixed token is an unrecognized option, not the source file.
|
|
174
|
+
rest = ARGV[1..] || []
|
|
175
|
+
if (unknown = rest.find { |a| a.start_with?('-') })
|
|
176
|
+
puts "#{'Error:'.error} unknown option `#{unknown}`"
|
|
177
|
+
puts usage_build
|
|
178
|
+
exit 1
|
|
179
|
+
end
|
|
180
|
+
ruby_file = rest.first
|
|
181
|
+
if ruby_file
|
|
182
|
+
build(targets, ruby_file)
|
|
183
|
+
else
|
|
184
|
+
puts usage_build
|
|
185
|
+
end
|
|
102
186
|
end
|
|
103
187
|
when 'launch'
|
|
104
188
|
require 'ruby2d/cli/launch'
|
|
@@ -107,32 +191,147 @@ when 'launch'
|
|
|
107
191
|
launch_native
|
|
108
192
|
when '--web'
|
|
109
193
|
launch_web
|
|
110
|
-
when '--
|
|
111
|
-
|
|
112
|
-
when '--tvos'
|
|
113
|
-
launch_apple('tvos')
|
|
194
|
+
when '--help', '-h'
|
|
195
|
+
puts usage_launch
|
|
114
196
|
else
|
|
115
197
|
puts usage_launch
|
|
116
198
|
end
|
|
117
|
-
|
|
118
|
-
|
|
199
|
+
when 'setup'
|
|
200
|
+
require 'ruby2d/cli/setup'
|
|
201
|
+
if ARGV.delete('--help') || ARGV.delete('-h')
|
|
202
|
+
puts usage_setup
|
|
203
|
+
else
|
|
204
|
+
force = !ARGV.delete('--force').nil?
|
|
205
|
+
clean = !ARGV.delete('--clean').nil?
|
|
206
|
+
yes = !(ARGV.delete('--yes') || ARGV.delete('-y')).nil?
|
|
207
|
+
# The known flags were deleted above, so any remaining `-`-prefixed token is
|
|
208
|
+
# an unrecognized option.
|
|
209
|
+
if (unknown = (ARGV[1..] || []).find { |a| a.start_with?('-') })
|
|
210
|
+
puts "#{'Error:'.error} unknown option `#{unknown}`"
|
|
211
|
+
puts usage_setup
|
|
212
|
+
exit 1
|
|
213
|
+
end
|
|
214
|
+
begin
|
|
215
|
+
setup(force: force, clean: clean, yes: yes)
|
|
216
|
+
rescue Interrupt
|
|
217
|
+
# Ctrl-C reaches the whole foreground process group, so it lands here
|
|
218
|
+
# rather than in `system`'s return value — and it can arrive at the
|
|
219
|
+
# confirmation prompt, mid-build, or during `gem pristine`. Report the
|
|
220
|
+
# cancel plainly instead of letting Ruby print an Interrupt backtrace;
|
|
221
|
+
# a build leaves no version stamp, so re-running resumes from the
|
|
222
|
+
# sources already cloned.
|
|
223
|
+
puts "\n\n Cancelled. Re-run #{'ruby2d setup'.bold} to pick up where this left off.\n\n"
|
|
224
|
+
exit 130
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
when 'usage'
|
|
228
|
+
require 'ruby2d/cli/usage'
|
|
229
|
+
case ARGV[1]
|
|
230
|
+
when nil
|
|
231
|
+
Ruby2D::CLI::Usage.browse
|
|
232
|
+
when 'list'
|
|
233
|
+
Ruby2D::CLI::Usage.print_list
|
|
234
|
+
when 'all'
|
|
235
|
+
Ruby2D::CLI::Usage.view(Ruby2D::CLI::Usage.content)
|
|
236
|
+
when '--help', '-h'
|
|
237
|
+
puts usage_usage
|
|
238
|
+
else
|
|
239
|
+
section = Ruby2D::CLI::Usage.find(ARGV[1])
|
|
240
|
+
if section
|
|
241
|
+
Ruby2D::CLI::Usage.view(section)
|
|
242
|
+
else
|
|
243
|
+
puts "#{'Error:'.error} No section matching '#{ARGV[1]}'."
|
|
244
|
+
Ruby2D::CLI::Usage.print_list
|
|
245
|
+
exit 1
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
when 'examples'
|
|
249
|
+
require 'ruby2d/cli/examples'
|
|
250
|
+
case ARGV[1]
|
|
251
|
+
when nil
|
|
252
|
+
Ruby2D::CLI::Examples.browse
|
|
253
|
+
when 'list'
|
|
254
|
+
Ruby2D::CLI::Examples.print_list
|
|
255
|
+
when 'source'
|
|
256
|
+
name = ARGV[2]
|
|
257
|
+
if name.nil?
|
|
258
|
+
puts "#{'Error:'.error} Specify an example: ruby2d examples source <name>"
|
|
259
|
+
Ruby2D::CLI::Examples.print_list
|
|
260
|
+
exit 1
|
|
261
|
+
end
|
|
262
|
+
example = Ruby2D::CLI::Examples.find(name)
|
|
263
|
+
if example
|
|
264
|
+
puts File.read(example[:path])
|
|
265
|
+
else
|
|
266
|
+
puts "#{'Error:'.error} No example matching '#{name}'."
|
|
267
|
+
Ruby2D::CLI::Examples.print_list
|
|
268
|
+
exit 1
|
|
269
|
+
end
|
|
270
|
+
when '--help', '-h'
|
|
271
|
+
puts usage_examples
|
|
272
|
+
else
|
|
273
|
+
example = Ruby2D::CLI::Examples.find(ARGV[1])
|
|
274
|
+
if example
|
|
275
|
+
puts
|
|
276
|
+
puts " #{'Ruby 2D'.ruby2d_red.bold} — Examples"
|
|
277
|
+
puts
|
|
278
|
+
puts " Running #{example[:title].bold} #{"(#{example[:name]}.rb)".dim}"
|
|
279
|
+
puts
|
|
280
|
+
Ruby2D::CLI::Examples.print_header(example)
|
|
281
|
+
# Run from the gem root so an example's relative asset paths (e.g.
|
|
282
|
+
# `assets/resources/spritesheets`) resolve against the bundled assets.
|
|
283
|
+
exec(Gem.ruby, example[:path], chdir: Ruby2D::CLI::Examples::ROOT_DIR)
|
|
284
|
+
else
|
|
285
|
+
puts "#{'Error:'.error} No example matching '#{ARGV[1]}'."
|
|
286
|
+
Ruby2D::CLI::Examples.print_list
|
|
287
|
+
exit 1
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
when 'agents'
|
|
291
|
+
require 'ruby2d/cli/usage'
|
|
292
|
+
sections = Ruby2D::CLI::Usage.all
|
|
293
|
+
|
|
294
|
+
print_help = lambda do
|
|
295
|
+
size_kb = (Ruby2D::CLI::Usage.content.bytesize / 1024.0).round
|
|
296
|
+
puts "Ruby 2D v#{Ruby2D::VERSION} — API reference for AI coding agents"
|
|
297
|
+
puts
|
|
298
|
+
puts 'The canonical source for using Ruby 2D. Output is plain Markdown.'
|
|
299
|
+
puts
|
|
300
|
+
puts 'Usage:'
|
|
301
|
+
puts " ruby2d agents all Print the full guide (~#{size_kb} KB)"
|
|
302
|
+
puts ' ruby2d agents <section> Print one section'
|
|
303
|
+
puts ' ruby2d agents all | grep -i <kw> Search across sections'
|
|
304
|
+
puts
|
|
305
|
+
puts 'Section names are case-insensitive and accept partial matches;'
|
|
306
|
+
puts 'spaces, hyphens, and underscores are interchangeable. Examples:'
|
|
307
|
+
puts
|
|
308
|
+
puts ' ruby2d agents shape-basics'
|
|
309
|
+
puts ' ruby2d agents getting-started'
|
|
310
|
+
puts ' ruby2d agents "Lines and Polygons"'
|
|
311
|
+
puts
|
|
312
|
+
puts 'For working code samples, see also:'
|
|
313
|
+
puts ' ruby2d examples list List all bundled examples'
|
|
314
|
+
puts ' ruby2d examples source <name> Print an example to stdout'
|
|
315
|
+
puts
|
|
316
|
+
puts 'Sections:'
|
|
317
|
+
sections.each { |s| puts " #{s[:title]}" }
|
|
318
|
+
end
|
|
319
|
+
|
|
119
320
|
case ARGV[1]
|
|
120
|
-
when '--
|
|
121
|
-
|
|
122
|
-
when '
|
|
123
|
-
puts
|
|
124
|
-
when '--open'
|
|
125
|
-
puts `simple2d simulator --open "#{ARGV[2]}"`
|
|
126
|
-
when '--install'
|
|
127
|
-
puts `simple2d simulator --install "#{ARGV[2]}"`
|
|
128
|
-
when '--launch'
|
|
129
|
-
puts `simple2d simulator --launch "#{ARGV[2]}"`
|
|
130
|
-
when '--log'
|
|
131
|
-
puts `simple2d simulator --log`
|
|
132
|
-
when '--log-errors'
|
|
133
|
-
puts `simple2d simulator --log-errors`
|
|
321
|
+
when nil, '--help', '-h'
|
|
322
|
+
print_help.call
|
|
323
|
+
when 'all'
|
|
324
|
+
puts Ruby2D::CLI::Usage.content
|
|
134
325
|
else
|
|
135
|
-
|
|
326
|
+
section = Ruby2D::CLI::Usage.find(ARGV[1])
|
|
327
|
+
if section
|
|
328
|
+
puts section[:content]
|
|
329
|
+
else
|
|
330
|
+
puts "No section matching '#{ARGV[1]}'."
|
|
331
|
+
puts
|
|
332
|
+
print_help.call
|
|
333
|
+
exit 1
|
|
334
|
+
end
|
|
136
335
|
end
|
|
137
336
|
when '-v', '--version'
|
|
138
337
|
puts Ruby2D::VERSION
|
data/examples/astar.rb
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# A* pathfinding
|
|
2
|
+
# Paint walls, then watch A*'s frontier fill in and trace the optimal path.
|
|
3
|
+
#
|
|
4
|
+
# Click and drag to paint walls; click and drag the green start or red
|
|
5
|
+
# goal to move them. Press SPACE to run A* — the search frontier fills
|
|
6
|
+
# in cell by cell, then the optimal path is highlighted in yellow. C
|
|
7
|
+
# clears the search overlay; R clears the grid back to empty.
|
|
8
|
+
|
|
9
|
+
require 'ruby2d'
|
|
10
|
+
|
|
11
|
+
# === Tunables ===
|
|
12
|
+
|
|
13
|
+
WIDTH = 800 # window width in pixels
|
|
14
|
+
HEIGHT = 600 # window height in pixels
|
|
15
|
+
HEADER = 40 # HUD strip height in pixels
|
|
16
|
+
CELL = 16 # rendered cell size in pixels
|
|
17
|
+
REVEAL_PER_FRAME = 14 # cells revealed per frame during the playback
|
|
18
|
+
|
|
19
|
+
GRID_TOP = HEADER
|
|
20
|
+
GRID_H = HEIGHT - GRID_TOP
|
|
21
|
+
COLS = WIDTH / CELL # 50
|
|
22
|
+
ROWS = GRID_H / CELL # 35
|
|
23
|
+
|
|
24
|
+
C_EMPTY = [0.06, 0.08, 0.13, 1].freeze
|
|
25
|
+
C_WALL = [0.50, 0.52, 0.62, 1].freeze
|
|
26
|
+
C_CLOSED = [0.18, 0.32, 0.55, 1].freeze
|
|
27
|
+
C_PATH = [0.99, 0.86, 0.32, 1].freeze
|
|
28
|
+
C_START = [0.32, 0.85, 0.40, 1].freeze
|
|
29
|
+
C_GOAL = [0.95, 0.30, 0.30, 1].freeze
|
|
30
|
+
|
|
31
|
+
HEADER_BG = '#131c2e' # HUD strip background
|
|
32
|
+
HEADER_RULE = '#1f2a40' # rule line under the HUD strip
|
|
33
|
+
HINT_COLOR = '#cbd5e1' # controls hint text
|
|
34
|
+
DIM_COLOR = '#94a3b8' # status label and counter
|
|
35
|
+
WARN_COLOR = '#fbbf24' # "no path" indicator
|
|
36
|
+
|
|
37
|
+
# === Window ===
|
|
38
|
+
|
|
39
|
+
set title: 'Ruby 2D ▸ Examples ▸ A* pathfinding',
|
|
40
|
+
width: WIDTH, height: HEIGHT, background: '#0b1220'
|
|
41
|
+
set close_on_esc: true
|
|
42
|
+
|
|
43
|
+
# === HUD ===
|
|
44
|
+
|
|
45
|
+
canvas = Canvas.new(x: 0, y: GRID_TOP, width: WIDTH, height: GRID_H, fill: C_EMPTY)
|
|
46
|
+
Rectangle.new(x: 0, y: 0, width: WIDTH, height: HEADER, color: HEADER_BG)
|
|
47
|
+
Line.new(x1: 0, y1: HEADER, x2: WIDTH, y2: HEADER, stroke_width: 1, color: HEADER_RULE)
|
|
48
|
+
|
|
49
|
+
Text.new('CLICK paint · DRAG start/goal · SPACE run · C clear · R reset',
|
|
50
|
+
x: 14, y: 13, size: 14, color: HINT_COLOR)
|
|
51
|
+
no_path_text = Text.new('no path', x: WIDTH - 230, y: 13, size: 14, color: WARN_COLOR, visible: false)
|
|
52
|
+
Text.new('Explored', x: WIDTH - 160, y: 13, size: 14, color: DIM_COLOR)
|
|
53
|
+
explored_number = Text.new('0', x: WIDTH - 70, y: 13, size: 14, color: DIM_COLOR)
|
|
54
|
+
|
|
55
|
+
# === Helpers ===
|
|
56
|
+
|
|
57
|
+
def manhattan(a, b)
|
|
58
|
+
(a[0] - b[0]).abs + (a[1] - b[1]).abs
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# === State ===
|
|
62
|
+
|
|
63
|
+
walls = Array.new(ROWS) { Array.new(COLS, false) }
|
|
64
|
+
start_cell = [3, ROWS / 2]
|
|
65
|
+
goal_cell = [COLS - 4, ROWS / 2]
|
|
66
|
+
closed_order = [] # cells closed by A*, in order
|
|
67
|
+
path = [] # final reconstructed path
|
|
68
|
+
reveal_idx = 0 # how many of `closed_order` have been drawn so far
|
|
69
|
+
mouse_mode = :none
|
|
70
|
+
dirty = true
|
|
71
|
+
|
|
72
|
+
# === Operations ===
|
|
73
|
+
|
|
74
|
+
clear_search = lambda do
|
|
75
|
+
closed_order.clear
|
|
76
|
+
path.clear
|
|
77
|
+
reveal_idx = 0
|
|
78
|
+
dirty = true
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Standard A* with Manhattan heuristic and 4-connected moves. Uses
|
|
82
|
+
# `min_by` for the priority pick — O(n²) over the search but fine at
|
|
83
|
+
# this grid size, and it keeps the example free of an external heap.
|
|
84
|
+
run_astar = lambda do
|
|
85
|
+
clear_search.call
|
|
86
|
+
open = [start_cell.dup]
|
|
87
|
+
open_set = { start_cell => true }
|
|
88
|
+
came_from = {}
|
|
89
|
+
g_score = { start_cell => 0 }
|
|
90
|
+
f_score = { start_cell => manhattan(start_cell, goal_cell) }
|
|
91
|
+
closed = {}
|
|
92
|
+
|
|
93
|
+
until open.empty?
|
|
94
|
+
current = open.min_by { |c| f_score[c] }
|
|
95
|
+
open.delete(current)
|
|
96
|
+
open_set.delete(current)
|
|
97
|
+
closed[current] = true
|
|
98
|
+
closed_order << current
|
|
99
|
+
|
|
100
|
+
if current == goal_cell
|
|
101
|
+
n = current
|
|
102
|
+
while n
|
|
103
|
+
path.unshift(n)
|
|
104
|
+
n = came_from[n]
|
|
105
|
+
end
|
|
106
|
+
dirty = true
|
|
107
|
+
return
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
[[1, 0], [-1, 0], [0, 1], [0, -1]].each do |dx, dy|
|
|
111
|
+
nx = current[0] + dx
|
|
112
|
+
ny = current[1] + dy
|
|
113
|
+
next if nx < 0 || nx >= COLS || ny < 0 || ny >= ROWS
|
|
114
|
+
next if walls[ny][nx]
|
|
115
|
+
|
|
116
|
+
neighbor = [nx, ny]
|
|
117
|
+
next if closed[neighbor]
|
|
118
|
+
|
|
119
|
+
tentative_g = g_score[current] + 1
|
|
120
|
+
next if g_score[neighbor] && tentative_g >= g_score[neighbor]
|
|
121
|
+
|
|
122
|
+
came_from[neighbor] = current
|
|
123
|
+
g_score[neighbor] = tentative_g
|
|
124
|
+
f_score[neighbor] = tentative_g + manhattan(neighbor, goal_cell)
|
|
125
|
+
unless open_set[neighbor]
|
|
126
|
+
open << neighbor
|
|
127
|
+
open_set[neighbor] = true
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
dirty = true
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# === Input ===
|
|
135
|
+
|
|
136
|
+
on :mouse_down do |event|
|
|
137
|
+
next if event.y < GRID_TOP
|
|
138
|
+
|
|
139
|
+
cx = event.x / CELL
|
|
140
|
+
cy = (event.y - GRID_TOP) / CELL
|
|
141
|
+
next if cx < 0 || cx >= COLS || cy < 0 || cy >= ROWS
|
|
142
|
+
|
|
143
|
+
cell = [cx, cy]
|
|
144
|
+
mouse_mode = if cell == start_cell
|
|
145
|
+
:move_start
|
|
146
|
+
elsif cell == goal_cell
|
|
147
|
+
:move_goal
|
|
148
|
+
elsif walls[cy][cx]
|
|
149
|
+
walls[cy][cx] = false
|
|
150
|
+
clear_search.call
|
|
151
|
+
:erase
|
|
152
|
+
else
|
|
153
|
+
walls[cy][cx] = true
|
|
154
|
+
clear_search.call
|
|
155
|
+
:paint
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
on :mouse_up do
|
|
160
|
+
mouse_mode = :none
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
on :mouse_move do |event|
|
|
164
|
+
next if mouse_mode == :none
|
|
165
|
+
next if event.y < GRID_TOP
|
|
166
|
+
|
|
167
|
+
cx = event.x / CELL
|
|
168
|
+
cy = (event.y - GRID_TOP) / CELL
|
|
169
|
+
next if cx < 0 || cx >= COLS || cy < 0 || cy >= ROWS
|
|
170
|
+
|
|
171
|
+
case mouse_mode
|
|
172
|
+
when :paint
|
|
173
|
+
unless walls[cy][cx]
|
|
174
|
+
walls[cy][cx] = true
|
|
175
|
+
clear_search.call
|
|
176
|
+
end
|
|
177
|
+
when :erase
|
|
178
|
+
if walls[cy][cx]
|
|
179
|
+
walls[cy][cx] = false
|
|
180
|
+
clear_search.call
|
|
181
|
+
end
|
|
182
|
+
when :move_start
|
|
183
|
+
if [cx, cy] != start_cell
|
|
184
|
+
start_cell[0] = cx
|
|
185
|
+
start_cell[1] = cy
|
|
186
|
+
walls[cy][cx] = false
|
|
187
|
+
clear_search.call
|
|
188
|
+
end
|
|
189
|
+
when :move_goal
|
|
190
|
+
if [cx, cy] != goal_cell
|
|
191
|
+
goal_cell[0] = cx
|
|
192
|
+
goal_cell[1] = cy
|
|
193
|
+
walls[cy][cx] = false
|
|
194
|
+
clear_search.call
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
on key_down: :space do
|
|
200
|
+
run_astar.call
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
on key_down: :r do
|
|
204
|
+
walls.each { |row| row.fill(false) }
|
|
205
|
+
clear_search.call
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
on key_down: :c do
|
|
209
|
+
clear_search.call
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# === Per-frame update ===
|
|
213
|
+
|
|
214
|
+
# The grid only needs a redraw when something has changed (mouse paint,
|
|
215
|
+
# search complete, animation step). Marking `dirty` lets the rest of
|
|
216
|
+
# the time skip the bucketing + canvas calls entirely.
|
|
217
|
+
update do
|
|
218
|
+
if reveal_idx < closed_order.length
|
|
219
|
+
reveal_idx += REVEAL_PER_FRAME
|
|
220
|
+
reveal_idx = closed_order.length if reveal_idx > closed_order.length
|
|
221
|
+
dirty = true
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
next unless dirty
|
|
225
|
+
|
|
226
|
+
canvas.clear
|
|
227
|
+
wall_rects = []
|
|
228
|
+
ROWS.times do |r|
|
|
229
|
+
row = walls[r]
|
|
230
|
+
COLS.times do |c|
|
|
231
|
+
wall_rects << [c * CELL, r * CELL, CELL, CELL] if row[c]
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
canvas.fill_rectangles(rectangles: wall_rects, color: C_WALL) unless wall_rects.empty?
|
|
235
|
+
|
|
236
|
+
closed_rects = []
|
|
237
|
+
i = 0
|
|
238
|
+
while i < reveal_idx
|
|
239
|
+
cell = closed_order[i]
|
|
240
|
+
closed_rects << [cell[0] * CELL, cell[1] * CELL, CELL, CELL] unless cell == start_cell || cell == goal_cell
|
|
241
|
+
i += 1
|
|
242
|
+
end
|
|
243
|
+
canvas.fill_rectangles(rectangles: closed_rects, color: C_CLOSED) unless closed_rects.empty?
|
|
244
|
+
|
|
245
|
+
if reveal_idx >= closed_order.length && !path.empty?
|
|
246
|
+
path_rects = []
|
|
247
|
+
path.each do |cell|
|
|
248
|
+
next if cell == start_cell || cell == goal_cell
|
|
249
|
+
|
|
250
|
+
path_rects << [cell[0] * CELL, cell[1] * CELL, CELL, CELL]
|
|
251
|
+
end
|
|
252
|
+
canvas.fill_rectangles(rectangles: path_rects, color: C_PATH) unless path_rects.empty?
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
canvas.fill_rectangle(x: start_cell[0] * CELL, y: start_cell[1] * CELL,
|
|
256
|
+
width: CELL, height: CELL, color: C_START)
|
|
257
|
+
canvas.fill_rectangle(x: goal_cell[0] * CELL, y: goal_cell[1] * CELL,
|
|
258
|
+
width: CELL, height: CELL, color: C_GOAL)
|
|
259
|
+
|
|
260
|
+
# HUD readout: cells explored so far (ticks up during playback), plus a
|
|
261
|
+
# "no path" flag once an exhausted search reveals no route to the goal.
|
|
262
|
+
count = reveal_idx.to_s
|
|
263
|
+
explored_number.content = count unless explored_number.content == count
|
|
264
|
+
no_path_text.visible = closed_order.any? && reveal_idx >= closed_order.length && path.empty?
|
|
265
|
+
|
|
266
|
+
dirty = false
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
show
|