ruby2d 0.12.1 → 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 -443
- data/assets/app.icns +0 -0
- data/assets/include/GL/glew.h +0 -26427
- 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
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# Ruby2D::Gamepad
|
|
2
|
+
|
|
3
|
+
module Ruby2D
|
|
4
|
+
# A connected gamepad. Lives from connect to disconnect; reconnects produce
|
|
5
|
+
# a new object. Identity-based equality (default Ruby behavior) makes
|
|
6
|
+
# `Gamepad` instances stable hash keys for per-pad state.
|
|
7
|
+
#
|
|
8
|
+
# Disconnected pads remain safe to poll: `held?` etc. return `false`,
|
|
9
|
+
# `axis` returns `0.0`, and feedback methods return `false` silently.
|
|
10
|
+
class Gamepad
|
|
11
|
+
# SDL3 enum values for symbol → integer translation. These mirror the
|
|
12
|
+
# `R2D_BUTTON_*` and `R2D_AXIS_*` constants in `ruby2d.h`. The C side
|
|
13
|
+
# already speaks symbols for events; these are only needed for capability
|
|
14
|
+
# queries that go from Ruby through to SDL.
|
|
15
|
+
BUTTON_ENUM = {
|
|
16
|
+
south: 0,
|
|
17
|
+
east: 1,
|
|
18
|
+
west: 2,
|
|
19
|
+
north: 3,
|
|
20
|
+
back: 4,
|
|
21
|
+
guide: 5,
|
|
22
|
+
start: 6,
|
|
23
|
+
left_stick: 7,
|
|
24
|
+
right_stick: 8,
|
|
25
|
+
left_shoulder: 9,
|
|
26
|
+
right_shoulder: 10,
|
|
27
|
+
dpad_up: 11,
|
|
28
|
+
dpad_down: 12,
|
|
29
|
+
dpad_left: 13,
|
|
30
|
+
dpad_right: 14,
|
|
31
|
+
misc1: 15,
|
|
32
|
+
paddle1: 16,
|
|
33
|
+
paddle2: 17,
|
|
34
|
+
paddle3: 18,
|
|
35
|
+
paddle4: 19,
|
|
36
|
+
touchpad: 20,
|
|
37
|
+
misc2: 21,
|
|
38
|
+
misc3: 22,
|
|
39
|
+
misc4: 23,
|
|
40
|
+
misc5: 24,
|
|
41
|
+
misc6: 25
|
|
42
|
+
}.freeze
|
|
43
|
+
|
|
44
|
+
AXIS_ENUM = {
|
|
45
|
+
left_x: 0,
|
|
46
|
+
left_y: 1,
|
|
47
|
+
right_x: 2,
|
|
48
|
+
right_y: 3,
|
|
49
|
+
left_trigger: 4,
|
|
50
|
+
right_trigger: 5
|
|
51
|
+
}.freeze
|
|
52
|
+
|
|
53
|
+
# Sticks only — triggers (0.0..1.0) are exempt because they rest at zero
|
|
54
|
+
# and rarely drift. 0.05 should cover typical worst-case stick drift.
|
|
55
|
+
DEFAULT_DEAD_ZONE = 0.05
|
|
56
|
+
|
|
57
|
+
TRIGGER_AXES = %i[left_trigger right_trigger].freeze
|
|
58
|
+
|
|
59
|
+
# Ordered list of axis names. `axes` always returns the full hash so the
|
|
60
|
+
# shape is stable.
|
|
61
|
+
AXIS_NAMES = AXIS_ENUM.keys.freeze
|
|
62
|
+
|
|
63
|
+
attr_reader :id, :name, :type
|
|
64
|
+
attr_accessor :dead_zone
|
|
65
|
+
|
|
66
|
+
def initialize(window, id, name)
|
|
67
|
+
@window = window
|
|
68
|
+
@id = id
|
|
69
|
+
@name = name || ''
|
|
70
|
+
@connected = true
|
|
71
|
+
@dead_zone = DEFAULT_DEAD_ZONE
|
|
72
|
+
|
|
73
|
+
# Cached per-connection metadata. `type` and capabilities don't change
|
|
74
|
+
# while the pad is connected, so we read them once and avoid the SDL
|
|
75
|
+
# round-trip on every call.
|
|
76
|
+
@type = Ext.window_gamepad_type(window, id)
|
|
77
|
+
caps = Ext.window_gamepad_caps(window, id)
|
|
78
|
+
@cap_rumble = caps & 0x1 != 0
|
|
79
|
+
@cap_rumble_triggers = caps & 0x2 != 0
|
|
80
|
+
@cap_led = caps & 0x4 != 0
|
|
81
|
+
|
|
82
|
+
# Per-button and per-axis presence is also cached at connect — one SDL
|
|
83
|
+
# call per known enum, then `has?(:button, name)` / `has?(:axis, name)`
|
|
84
|
+
# are pure hash reads. Cheap (~27 calls total) and matches the
|
|
85
|
+
# "capability checks are cached at connect time" rule in USAGE.md.
|
|
86
|
+
@btn_present = BUTTON_ENUM.each_with_object({}) do |(sym, enum), h|
|
|
87
|
+
h[sym] = Ext.window_gamepad_has_button(window, id, enum)
|
|
88
|
+
end
|
|
89
|
+
@axis_present = AXIS_ENUM.each_with_object({}) do |(sym, enum), h|
|
|
90
|
+
h[sym] = Ext.window_gamepad_has_axis(window, id, enum)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Frame-scoped event sets. Pressed/released/axes_moved are cleared by
|
|
94
|
+
# `_clear_frame_state`; held is also cleared and refilled each frame
|
|
95
|
+
# from the C-side held loop.
|
|
96
|
+
@buttons_down = []
|
|
97
|
+
@buttons_up = []
|
|
98
|
+
@buttons_held = []
|
|
99
|
+
@axes_moved = []
|
|
100
|
+
|
|
101
|
+
# Sticky axis values populated by motion events.
|
|
102
|
+
@axis_values = {}
|
|
103
|
+
AXIS_NAMES.each { |a| @axis_values[a] = 0.0 }
|
|
104
|
+
@raw_axis_values = @axis_values.dup
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def connected? = @connected
|
|
108
|
+
|
|
109
|
+
# Capability check. Forms:
|
|
110
|
+
# pad.has?(:rumble)
|
|
111
|
+
# pad.has?(:rumble_triggers)
|
|
112
|
+
# pad.has?(:led)
|
|
113
|
+
# pad.has?(:button, :paddle1)
|
|
114
|
+
# pad.has?(:axis, :left_trigger)
|
|
115
|
+
def has?(capability, name = nil)
|
|
116
|
+
return false unless @connected
|
|
117
|
+
|
|
118
|
+
case capability
|
|
119
|
+
when :rumble then @cap_rumble
|
|
120
|
+
when :rumble_triggers then @cap_rumble_triggers
|
|
121
|
+
when :led then @cap_led
|
|
122
|
+
when :button then @btn_present[name] || false
|
|
123
|
+
when :axis then @axis_present[name] || false
|
|
124
|
+
else false
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Battery — live query, since charge level changes during play. Returns
|
|
129
|
+
# one of `:wired`, `:full`, `:medium`, `:low`, `:empty`, or `nil` when
|
|
130
|
+
# SDL can't determine the state.
|
|
131
|
+
def battery
|
|
132
|
+
return nil unless @connected
|
|
133
|
+
|
|
134
|
+
state, percent = Ext.window_gamepad_battery(@window, @id)
|
|
135
|
+
case state
|
|
136
|
+
when :wired then :wired
|
|
137
|
+
when :on_battery
|
|
138
|
+
case percent
|
|
139
|
+
when -1 then :medium # plugged into a battery slot but no level reported
|
|
140
|
+
when 0..9 then :empty
|
|
141
|
+
when 10..29 then :low
|
|
142
|
+
when 30..74 then :medium
|
|
143
|
+
else :full
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Polling — currently held / current axis position.
|
|
149
|
+
def held?(button) = @buttons_held.include?(button)
|
|
150
|
+
|
|
151
|
+
def axis(name, raw: false)
|
|
152
|
+
return 0.0 unless AXIS_ENUM.key?(name)
|
|
153
|
+
|
|
154
|
+
v = (raw ? @raw_axis_values : @axis_values)[name]
|
|
155
|
+
v || 0.0
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def buttons_held = @buttons_held.dup
|
|
159
|
+
|
|
160
|
+
def axes
|
|
161
|
+
AXIS_NAMES.each_with_object({}) { |a, h| h[a] = @axis_values[a] || 0.0 }
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Polling — frame-scoped transitions. Cleared each frame by
|
|
165
|
+
# `_clear_frame_state`.
|
|
166
|
+
def pressed?(button) = @buttons_down.include?(button)
|
|
167
|
+
def released?(button) = @buttons_up.include?(button)
|
|
168
|
+
def axis_moved?(axis) = @axes_moved.include?(axis)
|
|
169
|
+
def axes_moved = @axes_moved.dup
|
|
170
|
+
|
|
171
|
+
# Feedback. `rumble`, `rumble_triggers`, and `set_led` return `false` when
|
|
172
|
+
# the pad is disconnected or the SDL call fails — never raise. `led=` is a
|
|
173
|
+
# convenience alias of `set_led`; being a Ruby assignment it evaluates to the
|
|
174
|
+
# assigned value, not the success Boolean, so use `set_led` when you need it.
|
|
175
|
+
#
|
|
176
|
+
# `rumble(strength:, duration:)` is the simple form; the low/high form
|
|
177
|
+
# exposes the dual-motor pattern most pads expose.
|
|
178
|
+
def rumble(strength: nil, low: nil, high: nil, duration: 0.2)
|
|
179
|
+
return false unless @connected
|
|
180
|
+
|
|
181
|
+
if strength
|
|
182
|
+
low ||= strength
|
|
183
|
+
high ||= strength
|
|
184
|
+
end
|
|
185
|
+
low ||= 0.0
|
|
186
|
+
high ||= 0.0
|
|
187
|
+
Ext.window_gamepad_rumble(@window, @id, low.to_f, high.to_f, duration.to_f)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def rumble_triggers(left: 0.0, right: 0.0, duration: 0.2)
|
|
191
|
+
return false unless @connected
|
|
192
|
+
|
|
193
|
+
Ext.window_gamepad_rumble_triggers(@window, @id,
|
|
194
|
+
left.to_f, right.to_f, duration.to_f)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Set the LED color from an `[r, g, b]` triple. Returns `false` on failure.
|
|
198
|
+
def set_led(rgb)
|
|
199
|
+
return false unless @connected
|
|
200
|
+
r, g, b = rgb
|
|
201
|
+
Ext.window_gamepad_set_led(@window, @id, r.to_i, g.to_i, b.to_i)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Convenience setter form of `set_led`. As a Ruby assignment it returns the
|
|
205
|
+
# assigned value, not the success Boolean — call `set_led` if you need that.
|
|
206
|
+
def led=(rgb)
|
|
207
|
+
set_led(rgb)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Snapshot of the underlying joystick's raw input state — buttons,
|
|
211
|
+
# axes (raw -32768..32767), and hats (SDL hat bitmask). Bypasses any
|
|
212
|
+
# gamepad mapping. Intended for mapping-generation tools that need to
|
|
213
|
+
# observe the physical hardware before SDL remaps it. Returns `nil`
|
|
214
|
+
# when the pad is disconnected.
|
|
215
|
+
def joystick_state
|
|
216
|
+
return nil unless @connected
|
|
217
|
+
|
|
218
|
+
arr = Ext.window_gamepad_joystick_state(@window, @id) or return nil
|
|
219
|
+
{ buttons: arr[0], axes: arr[1], hats: arr[2] }
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Read-only snapshot of low-level metadata SDL exposes about the pad —
|
|
223
|
+
# useful when adding a custom mapping for an unrecognized device, or
|
|
224
|
+
# diagnosing why a connected device behaves oddly. Returns `nil` when
|
|
225
|
+
# the pad is disconnected.
|
|
226
|
+
#
|
|
227
|
+
# Keys:
|
|
228
|
+
# :guid — 32-char SDL GUID hex string (the same string used
|
|
229
|
+
# in `gamepads.txt` mapping entries)
|
|
230
|
+
# :vendor_id — USB-style vendor ID (Integer; format as `%04x`)
|
|
231
|
+
# :product_id — USB-style product ID (Integer; format as `%04x`)
|
|
232
|
+
# :version — product version (Integer; format as `%04x`)
|
|
233
|
+
# :serial — String, or nil if SDL has no serial for this pad
|
|
234
|
+
# :connection — :wired, :wireless, or :unknown
|
|
235
|
+
# :real_type — the underlying gamepad type before any user mapping
|
|
236
|
+
# remaps it (:xbox / :playstation / :nintendo /
|
|
237
|
+
# :generic / :unknown)
|
|
238
|
+
# :num_touchpads — count of touchpad surfaces (PS4/PS5 = 1, most = 0)
|
|
239
|
+
# :mapping — the resolved SDL gamepad mapping string, or nil
|
|
240
|
+
def debug_info
|
|
241
|
+
return nil unless @connected
|
|
242
|
+
|
|
243
|
+
arr = Ext.window_gamepad_debug_info(@window, @id) or return nil
|
|
244
|
+
{
|
|
245
|
+
guid: arr[0],
|
|
246
|
+
vendor_id: arr[1],
|
|
247
|
+
product_id: arr[2],
|
|
248
|
+
version: arr[3],
|
|
249
|
+
serial: arr[4],
|
|
250
|
+
connection: arr[5],
|
|
251
|
+
real_type: arr[6],
|
|
252
|
+
num_touchpads: arr[7],
|
|
253
|
+
mapping: arr[8]
|
|
254
|
+
}
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# ----- Internal: dispatch hooks called from gamepad_callback -----
|
|
258
|
+
|
|
259
|
+
def _apply_button_down(button)
|
|
260
|
+
return unless @connected
|
|
261
|
+
@buttons_down << button unless @buttons_down.include?(button)
|
|
262
|
+
@buttons_held << button unless @buttons_held.include?(button)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def _apply_button_held(button)
|
|
266
|
+
return unless @connected
|
|
267
|
+
@buttons_held << button unless @buttons_held.include?(button)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def _apply_button_up(button)
|
|
271
|
+
return unless @connected
|
|
272
|
+
@buttons_up << button unless @buttons_up.include?(button)
|
|
273
|
+
@buttons_held.delete(button)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# Returns the dead-zoned value (which is what handlers receive), or `nil`
|
|
277
|
+
# if the value didn't move outside the dead-zoned region — letting the
|
|
278
|
+
# caller suppress event emission for motion entirely inside the dead zone.
|
|
279
|
+
def _apply_axis(axis, raw_value)
|
|
280
|
+
return nil unless @connected
|
|
281
|
+
return nil unless AXIS_ENUM.key?(axis)
|
|
282
|
+
|
|
283
|
+
previous = @axis_values[axis] || 0.0
|
|
284
|
+
dz = apply_dead_zone(axis, raw_value)
|
|
285
|
+
|
|
286
|
+
@raw_axis_values[axis] = raw_value
|
|
287
|
+
@axis_values[axis] = dz
|
|
288
|
+
|
|
289
|
+
if dz != previous
|
|
290
|
+
@axes_moved << axis unless @axes_moved.include?(axis)
|
|
291
|
+
dz
|
|
292
|
+
else
|
|
293
|
+
nil
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def _clear_frame_state
|
|
298
|
+
@buttons_down.clear
|
|
299
|
+
@buttons_up.clear
|
|
300
|
+
@buttons_held.clear
|
|
301
|
+
@axes_moved.clear
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def _disconnect
|
|
305
|
+
@connected = false
|
|
306
|
+
@buttons_down.clear
|
|
307
|
+
@buttons_up.clear
|
|
308
|
+
@buttons_held.clear
|
|
309
|
+
@axes_moved.clear
|
|
310
|
+
AXIS_NAMES.each do |a|
|
|
311
|
+
@axis_values[a] = 0.0
|
|
312
|
+
@raw_axis_values[a] = 0.0
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
private
|
|
317
|
+
|
|
318
|
+
def apply_dead_zone(axis, value)
|
|
319
|
+
return value if @dead_zone <= 0.0 || TRIGGER_AXES.include?(axis)
|
|
320
|
+
value.abs < @dead_zone ? 0.0 : value
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Extension-free path helpers. These live apart from the rest of `ruby2d` so the
|
|
2
|
+
# tooling that must run *before* the native extension exists — the `ruby2d setup`
|
|
3
|
+
# command that builds it, and the extconf that links it — can locate the gem's
|
|
4
|
+
# files without loading the (possibly not-yet-built) `.so`.
|
|
5
|
+
|
|
6
|
+
module Ruby2D
|
|
7
|
+
def self.gem_dir
|
|
8
|
+
# mruby doesn't define `Gem`
|
|
9
|
+
if RUBY_ENGINE == 'mruby'
|
|
10
|
+
`ruby -e "print Gem::Specification.find_by_name('ruby2d').gem_dir"`
|
|
11
|
+
else
|
|
12
|
+
Gem::Specification.find_by_name('ruby2d').gem_dir
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.assets
|
|
17
|
+
"#{gem_dir}/assets"
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/ruby2d/image.rb
CHANGED
|
@@ -1,79 +1,182 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
# Ruby2D::Image
|
|
4
2
|
|
|
5
3
|
module Ruby2D
|
|
6
|
-
#
|
|
7
|
-
# To draw an image in the window, use the following, providing the image file path:
|
|
8
|
-
# +Image.new('star.png')+
|
|
4
|
+
# An image drawn in the window
|
|
9
5
|
class Image
|
|
10
6
|
include Renderable
|
|
11
7
|
|
|
8
|
+
# Image uses `tint` instead of `color` — the image already has its own
|
|
9
|
+
# colors in the texture; tint modulates them.
|
|
10
|
+
undef_method :color, :color=, :colour, :colour=
|
|
11
|
+
|
|
12
12
|
attr_reader :path
|
|
13
|
-
attr_accessor :
|
|
14
|
-
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
atlas.load_and_keep_image(path, as: path)
|
|
22
|
-
else
|
|
23
|
-
Pixmap.new path
|
|
24
|
-
end
|
|
25
|
-
pixmap.texture
|
|
13
|
+
attr_accessor :width, :height, :rotate
|
|
14
|
+
|
|
15
|
+
# Set the x position. Pass a symbol (`:left`, `:center`, `:right`) to
|
|
16
|
+
# set alignment intent — resolved at draw time against the window.
|
|
17
|
+
def x=(value)
|
|
18
|
+
return self.x_align = value if value.is_a?(Symbol)
|
|
19
|
+
@x_align = nil unless @_resolving_alignment
|
|
20
|
+
@x = value
|
|
26
21
|
end
|
|
27
22
|
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
width: nil, height: nil, x: 0, y: 0, z: 0,
|
|
41
|
-
rotate: 0, color: nil, colour: nil,
|
|
42
|
-
opacity: nil, show: true)
|
|
43
|
-
@path = path.to_s
|
|
23
|
+
# Set the y position. Pass a symbol (`:top`, `:center`, `:bottom`) to
|
|
24
|
+
# set alignment intent — resolved at draw time against the window.
|
|
25
|
+
def y=(value)
|
|
26
|
+
return self.y_align = value if value.is_a?(Symbol)
|
|
27
|
+
@y_align = nil unless @_resolving_alignment
|
|
28
|
+
@y = value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Get the rotation center x coordinate
|
|
32
|
+
def rx
|
|
33
|
+
@_user_rx.nil? ? @x + @width / 2.0 : @_user_rx
|
|
34
|
+
end
|
|
44
35
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@
|
|
48
|
-
|
|
36
|
+
# Get the rotation center y coordinate
|
|
37
|
+
def ry
|
|
38
|
+
@_user_ry.nil? ? @y + @height / 2.0 : @_user_ry
|
|
39
|
+
end
|
|
49
40
|
|
|
41
|
+
# Set the rotation center x coordinate
|
|
42
|
+
def rx=(val)
|
|
43
|
+
@_user_rx = val
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Set the rotation center y coordinate
|
|
47
|
+
def ry=(val)
|
|
48
|
+
@_user_ry = val
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Create an image
|
|
52
|
+
def initialize(path,
|
|
53
|
+
width: nil, height: nil, x: 0, y: 0, z: 0,
|
|
54
|
+
rotate: 0, rx: nil, ry: nil, tint: nil,
|
|
55
|
+
opacity: nil, add: true, visible: true,
|
|
56
|
+
padding: nil, padding_top: nil, padding_right: nil,
|
|
57
|
+
padding_bottom: nil, padding_left: nil,
|
|
58
|
+
_share_from: nil)
|
|
59
|
+
@width = width
|
|
60
|
+
@height = height
|
|
61
|
+
|
|
62
|
+
x, y = _extract_alignment(x, y)
|
|
63
|
+
_apply_padding(padding, padding_top, padding_right, padding_bottom, padding_left)
|
|
50
64
|
@x = x
|
|
51
65
|
@y = y
|
|
52
66
|
@z = z
|
|
53
67
|
@rotate = rotate
|
|
54
|
-
|
|
55
|
-
|
|
68
|
+
@_user_rx = rx
|
|
69
|
+
@_user_ry = ry
|
|
70
|
+
self.tint = tint || 'white'
|
|
71
|
+
self.tint.opacity = opacity unless opacity.nil?
|
|
72
|
+
|
|
73
|
+
if _share_from
|
|
74
|
+
# SpriteSheet uses this to give every Sprite the same backing texture
|
|
75
|
+
# without re-decoding the file or re-uploading to the GPU.
|
|
76
|
+
@path = _share_from.path
|
|
77
|
+
@ext_image = _share_from.instance_variable_get(:@ext_image)
|
|
78
|
+
@orig_width = _share_from.instance_variable_get(:@orig_width)
|
|
79
|
+
@orig_height = _share_from.instance_variable_get(:@orig_height)
|
|
80
|
+
@width ||= @orig_width
|
|
81
|
+
@height ||= @orig_height
|
|
82
|
+
@clipped = false
|
|
83
|
+
@clip_x = 0.0
|
|
84
|
+
@clip_y = 0.0
|
|
85
|
+
@clip_width = @orig_width
|
|
86
|
+
@clip_height = @orig_height
|
|
87
|
+
else
|
|
88
|
+
@path = path.to_s
|
|
89
|
+
raise Error, "Image file `#{@path}` not found" unless File.exist?(@path)
|
|
56
90
|
|
|
57
|
-
|
|
91
|
+
# Preserve user-provided values before image_create may overwrite them
|
|
92
|
+
provided_width = @width
|
|
93
|
+
provided_height = @height
|
|
94
|
+
provided_rotate = @rotate
|
|
95
|
+
Ext.image_create(self)
|
|
96
|
+
|
|
97
|
+
@width = provided_width || @width
|
|
98
|
+
@height = provided_height || @height
|
|
99
|
+
@rotate = provided_rotate
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
@visible = visible
|
|
103
|
+
self.add if add
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Re-rasterize the source at a new pixel size and update `width`/`height`.
|
|
107
|
+
# For SVGs this re-runs the vector rasterizer so the image stays crisp at
|
|
108
|
+
# the new size. For raster images it resamples the source to the new size
|
|
109
|
+
# — useful for trimming GPU memory when displaying a large source small.
|
|
110
|
+
# Called with no arguments, re-rasterizes at the current `width`/`height`
|
|
111
|
+
# — handy after assigning to `width=`/`height=` to commit a fresh raster.
|
|
112
|
+
def resize!(width = @width, height = @height)
|
|
113
|
+
unless width.is_a?(Numeric) && height.is_a?(Numeric) && width.positive? && height.positive?
|
|
114
|
+
raise Error, 'Image#resize! requires positive width and height'
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Ext.image_resize(self, width, height)
|
|
118
|
+
@width = width
|
|
119
|
+
@height = height
|
|
120
|
+
self
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# The image's tint color. The image's own texture colors are multiplied
|
|
124
|
+
# by this — `tint: 'red'` makes the image redder, not solid red.
|
|
125
|
+
def tint
|
|
126
|
+
@color
|
|
58
127
|
end
|
|
59
128
|
|
|
60
|
-
def
|
|
129
|
+
def tint=(c)
|
|
130
|
+
@color = Color.new(c)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Render the image. Called with overrides for one-shot rendering inside a
|
|
134
|
+
# render block; with no arguments it draws the same frame the scene graph
|
|
135
|
+
# does (delegating to `_render_scene`).
|
|
136
|
+
def render(x: nil, y: nil, width: nil, height: nil, rotate: nil,
|
|
137
|
+
tint: nil, opacity: nil)
|
|
138
|
+
if x.nil? && y.nil? && width.nil? && height.nil? && rotate.nil? &&
|
|
139
|
+
tint.nil? && opacity.nil?
|
|
140
|
+
return _render_scene
|
|
141
|
+
end
|
|
142
|
+
|
|
61
143
|
Window.render_ready_check
|
|
62
144
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
145
|
+
saved_x, saved_y = @x, @y
|
|
146
|
+
saved_width, saved_height = @width, @height
|
|
147
|
+
saved_rotate = @rotate
|
|
148
|
+
saved_color = @color
|
|
149
|
+
|
|
150
|
+
@x = x if x
|
|
151
|
+
@y = y if y
|
|
152
|
+
@width = width if width
|
|
153
|
+
@height = height if height
|
|
154
|
+
@rotate = rotate if rotate
|
|
155
|
+
|
|
156
|
+
if tint || opacity
|
|
157
|
+
@color = tint ? Color.new(tint) : Color.new(saved_color)
|
|
158
|
+
@color.opacity = opacity if opacity
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
begin
|
|
162
|
+
Ext.image_draw(self)
|
|
163
|
+
ensure
|
|
164
|
+
@x, @y = saved_x, saved_y
|
|
165
|
+
@width, @height = saved_width, saved_height
|
|
166
|
+
@rotate = saved_rotate
|
|
167
|
+
@color = saved_color
|
|
168
|
+
end
|
|
67
169
|
end
|
|
68
170
|
|
|
69
171
|
private
|
|
70
172
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
)
|
|
173
|
+
# Scene-graph draw hook (see Renderable#_render_scene): `render` with no
|
|
174
|
+
# overrides, minus its keyword handling — a zero-arg call into the
|
|
175
|
+
# 7-keyword `render` still pays ~3.4µs of keyword setup on wasm mruby.
|
|
176
|
+
def _render_scene
|
|
177
|
+
_resolve_alignment
|
|
178
|
+
Ext.image_draw(self)
|
|
77
179
|
end
|
|
180
|
+
public :_render_scene
|
|
78
181
|
end
|
|
79
182
|
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Ruby2D::Interactive
|
|
2
|
+
|
|
3
|
+
module Ruby2D
|
|
4
|
+
# Per-object event handling for objects that participate in Window's
|
|
5
|
+
# interactive registry. Provides `on` / `off` / `interactive?` and the
|
|
6
|
+
# `_fire_event` dispatch entry point. Mixed into `Renderable` and `Button`.
|
|
7
|
+
#
|
|
8
|
+
# Including objects must expose `x`, `y`, `z`, `width`, `height`, and
|
|
9
|
+
# `contains?(x, y)` so `Window::ObjectEventDispatch` can hit-test them.
|
|
10
|
+
module Interactive
|
|
11
|
+
# Per-object events that take a value matcher (button) in the kwarg form.
|
|
12
|
+
# `:hover`, `:hover_out`, and `:mouse_scroll` carry no matchable field.
|
|
13
|
+
OBJECT_EVENT_FILTER_PREDICATES = {
|
|
14
|
+
mouse_down: :button?, mouse_held: :button?, mouse_up: :button?,
|
|
15
|
+
click: :button?, drag: :button?
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
# The full per-object event vocabulary: the filterable events above plus the
|
|
19
|
+
# three that carry no matchable field. Derived from the predicates map so the
|
|
20
|
+
# two can't drift, and mirrors what Window::ObjectEventDispatch fires.
|
|
21
|
+
OBJECT_EVENTS = (OBJECT_EVENT_FILTER_PREDICATES.keys + %i[hover hover_out mouse_scroll]).freeze
|
|
22
|
+
|
|
23
|
+
# Register a per-object event handler. Two forms:
|
|
24
|
+
#
|
|
25
|
+
# obj.on(:click) { |event| ... }
|
|
26
|
+
# obj.on(click: :left) { ... } # filtered
|
|
27
|
+
# obj.on(click: [:left, :right]) { ... } # array → match any
|
|
28
|
+
# obj.on(mouse_down: :left, click: :left) { ... } # multi-event
|
|
29
|
+
def on(event = nil, **filters, &proc)
|
|
30
|
+
raise Error, '`on` requires a block' unless proc
|
|
31
|
+
if event.is_a?(Symbol) && filters.empty?
|
|
32
|
+
raise Error, "`#{event}` is not a valid object event" unless OBJECT_EVENTS.include?(event)
|
|
33
|
+
register_object_event_handler(event, proc)
|
|
34
|
+
elsif event.nil? && !filters.empty?
|
|
35
|
+
descriptors = filters.map do |type, matcher|
|
|
36
|
+
predicate = OBJECT_EVENT_FILTER_PREDICATES[type] or
|
|
37
|
+
raise Error, "`#{type}` does not support filtering with `on event: value`"
|
|
38
|
+
values = Array(matcher)
|
|
39
|
+
wrapped = ->(e) { proc.call(e) if values.any? { |v| e.send(predicate, v) } }
|
|
40
|
+
register_object_event_handler(type, wrapped)
|
|
41
|
+
end
|
|
42
|
+
descriptors.size == 1 ? descriptors.first : descriptors
|
|
43
|
+
else
|
|
44
|
+
raise Error, '`on` requires either an event symbol or event filters'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Remove a per-object event handler (or several, given an array).
|
|
49
|
+
def off(descriptor)
|
|
50
|
+
return descriptor.each { |d| off(d) } if descriptor.is_a?(Array)
|
|
51
|
+
|
|
52
|
+
unless descriptor.is_a?(Window::ObjectEventDescriptor)
|
|
53
|
+
raise Error,
|
|
54
|
+
"Cannot remove event handler: expected a descriptor returned by `on`, got #{descriptor.inspect}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
return unless @_object_events
|
|
58
|
+
|
|
59
|
+
handlers = @_object_events[descriptor.type]
|
|
60
|
+
return unless handlers
|
|
61
|
+
|
|
62
|
+
handlers.delete(descriptor.id)
|
|
63
|
+
@_object_events.delete(descriptor.type) if handlers.empty?
|
|
64
|
+
|
|
65
|
+
Window.unregister_interactive(self) unless interactive?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Check if this object has any event handlers
|
|
69
|
+
def interactive?(event = nil)
|
|
70
|
+
return false unless @_object_events
|
|
71
|
+
|
|
72
|
+
if event
|
|
73
|
+
@_object_events.key?(event) && !@_object_events[event].empty?
|
|
74
|
+
else
|
|
75
|
+
@_object_events.any? { |_type, handlers| !handlers.empty? }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Dispatch an event to stored handlers (called by Window)
|
|
80
|
+
def _fire_event(type, event)
|
|
81
|
+
return unless @_object_events
|
|
82
|
+
|
|
83
|
+
handlers = @_object_events[type]
|
|
84
|
+
return unless handlers
|
|
85
|
+
|
|
86
|
+
# Snapshot the values: a handler may register another handler for the same
|
|
87
|
+
# event type mid-dispatch, which would otherwise mutate the hash we're
|
|
88
|
+
# iterating ("can't add a new key into hash during iteration").
|
|
89
|
+
handlers.values.each { |proc| proc.call(event) }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def register_object_event_handler(event, proc)
|
|
95
|
+
@_object_events ||= {}
|
|
96
|
+
@_object_events[event] ||= {}
|
|
97
|
+
id = (@_object_event_key = (@_object_event_key || 0) + 1)
|
|
98
|
+
@_object_events[event][id] = proc
|
|
99
|
+
Window.register_interactive(self)
|
|
100
|
+
Window::ObjectEventDescriptor.new(self, event, id)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|