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
data/lib/ruby2d/sprite.rb
CHANGED
|
@@ -1,218 +1,452 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
# Ruby2D::Sprite
|
|
4
2
|
|
|
5
3
|
module Ruby2D
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
class Sprite
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
#
|
|
49
|
-
@
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
4
|
+
# An animated sprite from a single image, a horizontal strip sprite sheet, or
|
|
5
|
+
# a SpriteSheet (texture atlas).
|
|
6
|
+
class Sprite < Image
|
|
7
|
+
attr_reader :flip, :sheet, :speed, :frame
|
|
8
|
+
attr_accessor :clip_x, :clip_y, :clip_width, :clip_height
|
|
9
|
+
|
|
10
|
+
# Sentinel default for `update`'s `dt`. Lets the no-arg scene-graph call defer
|
|
11
|
+
# resolving `Window.delta_time` until after the `@playing` guard, so a paused
|
|
12
|
+
# or static sprite never pays for it. A frozen unique object, so an explicit
|
|
13
|
+
# `update(nil)` is still distinct from the default and behaves as before.
|
|
14
|
+
UPDATE_DT_UNSET = Object.new.freeze
|
|
15
|
+
private_constant :UPDATE_DT_UNSET
|
|
16
|
+
|
|
17
|
+
# Create a sprite. `source` can be either an image path or a SpriteSheet
|
|
18
|
+
# instance. When given a SpriteSheet, animations may reference frames by
|
|
19
|
+
# name (strings or `{ name:, time: }` hashes) and `frame:` selects a
|
|
20
|
+
# single static frame.
|
|
21
|
+
def initialize(source, width: nil, height: nil,
|
|
22
|
+
x: 0, y: 0, z: 0, rotate: 0, rx: nil, ry: nil,
|
|
23
|
+
tint: nil, opacity: nil,
|
|
24
|
+
loop: false, time: 300, speed: 1.0,
|
|
25
|
+
animations: nil, default: 0,
|
|
26
|
+
frame: nil,
|
|
27
|
+
clip_x: 0, clip_y: 0, clip_width: nil, clip_height: nil,
|
|
28
|
+
add: true, visible: true,
|
|
29
|
+
padding: nil, padding_top: nil, padding_right: nil,
|
|
30
|
+
padding_bottom: nil, padding_left: nil)
|
|
31
|
+
@sheet = source.is_a?(SpriteSheet) ? source : nil
|
|
32
|
+
|
|
33
|
+
if @sheet
|
|
34
|
+
super(nil, x: x, y: y, z: z, rotate: rotate, rx: rx, ry: ry,
|
|
35
|
+
tint: tint, opacity: opacity, add: false,
|
|
36
|
+
padding: padding, padding_top: padding_top, padding_right: padding_right,
|
|
37
|
+
padding_bottom: padding_bottom, padding_left: padding_left,
|
|
38
|
+
_share_from: @sheet.texture)
|
|
39
|
+
else
|
|
40
|
+
super(source, x: x, y: y, z: z, rotate: rotate, rx: rx, ry: ry,
|
|
41
|
+
tint: tint, opacity: opacity, add: false,
|
|
42
|
+
padding: padding, padding_top: padding_top, padding_right: padding_right,
|
|
43
|
+
padding_bottom: padding_bottom, padding_left: padding_left)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Stash the resolved sheet rect (if any) so trim metadata can be
|
|
47
|
+
# applied after @clip_width/@clip_height get their final values.
|
|
48
|
+
sheet_rect = nil
|
|
49
|
+
|
|
50
|
+
if frame
|
|
51
|
+
raise Error, '`frame:` requires a SpriteSheet source' unless @sheet
|
|
52
|
+
|
|
53
|
+
sheet_rect = lookup_sheet_frame(frame.to_s)
|
|
54
|
+
clip_x = sheet_rect[:x]
|
|
55
|
+
clip_y = sheet_rect[:y]
|
|
56
|
+
clip_width = sheet_rect[:width]
|
|
57
|
+
clip_height = sheet_rect[:height]
|
|
58
|
+
@frame = frame.to_s
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
@img_width = @orig_width
|
|
62
|
+
@img_height = @orig_height
|
|
63
|
+
|
|
53
64
|
@flip = nil
|
|
54
65
|
|
|
55
|
-
# Animation attributes
|
|
56
66
|
@loop = loop
|
|
57
67
|
@frame_time = time
|
|
58
|
-
|
|
68
|
+
self.speed = speed
|
|
69
|
+
@animations = normalize_animations(animations || {})
|
|
59
70
|
@current_frame = default
|
|
60
71
|
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
# When a sheet is in use and no explicit clip / frame was given, fall back
|
|
73
|
+
# to the first frame in the sheet so the sprite shows something useful.
|
|
74
|
+
if @sheet && !frame && clip_width.nil? && clip_height.nil?
|
|
75
|
+
first = first_sheet_rect
|
|
76
|
+
if first
|
|
77
|
+
sheet_rect = first
|
|
78
|
+
clip_x = first[:x]
|
|
79
|
+
clip_y = first[:y]
|
|
80
|
+
clip_width = first[:width]
|
|
81
|
+
clip_height = first[:height]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
63
84
|
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
@clip_x = clip_x
|
|
86
|
+
@clip_y = clip_y
|
|
87
|
+
@clip_width = (clip_width || @img_width ).to_i
|
|
88
|
+
@clip_height = (clip_height || @img_height).to_i
|
|
89
|
+
@clip_width = @img_width if @clip_width <= 0
|
|
90
|
+
@clip_height = @img_height if @clip_height <= 0
|
|
91
|
+
|
|
92
|
+
# Trim metadata. For atlas frames it can come from the sheet rect;
|
|
93
|
+
# for path-based sprites and untrimmed atlas frames it falls back
|
|
94
|
+
# to the no-trim defaults (source = clip, trim = 0). With those
|
|
95
|
+
# defaults, the C draw path's trim math collapses to today's
|
|
96
|
+
# untrimmed behavior.
|
|
97
|
+
@source_width = (sheet_rect && sheet_rect[:source_width]) || @clip_width
|
|
98
|
+
@source_height = (sheet_rect && sheet_rect[:source_height]) || @clip_height
|
|
99
|
+
@trim_x = (sheet_rect && sheet_rect[:trim_x]) || 0
|
|
100
|
+
@trim_y = (sheet_rect && sheet_rect[:trim_y]) || 0
|
|
101
|
+
|
|
102
|
+
# Track user-provided display dimensions so animations can update
|
|
103
|
+
# @width/@height to match the source (footprint) dimensions when no
|
|
104
|
+
# explicit size was given.
|
|
105
|
+
@user_width = width
|
|
106
|
+
@user_height = height
|
|
107
|
+
@width = width || @source_width
|
|
108
|
+
@height = height || @source_height
|
|
109
|
+
|
|
110
|
+
@clipped = true
|
|
111
|
+
|
|
112
|
+
setup_animation
|
|
113
|
+
|
|
114
|
+
@visible = visible
|
|
115
|
+
self.add if add
|
|
66
116
|
end
|
|
67
117
|
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
#
|
|
118
|
+
# A SpriteSheet-backed sprite shares one backing texture with every other
|
|
119
|
+
# sprite cut from the same sheet. Re-rasterizing it (Image#resize!) would
|
|
120
|
+
# silently corrupt all of them and invalidate the sheet's frame coordinates,
|
|
121
|
+
# so refuse it. Path/strip-backed sprites own their texture and resize fine.
|
|
122
|
+
def resize!(width = @width, height = @height)
|
|
123
|
+
if @sheet
|
|
124
|
+
raise Error,
|
|
125
|
+
'Cannot resize! a SpriteSheet-backed sprite: its texture is shared ' \
|
|
126
|
+
'by every sprite cut from the same sheet. Use a standalone Image, or ' \
|
|
127
|
+
'set width/height to change only this sprite\'s display size.'
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
super
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Set the displayed width. Like the `width:` constructor option, this persists
|
|
134
|
+
# across animation frames (stored as the user override). A sprite without an
|
|
135
|
+
# explicit size tracks each frame's source dimensions; set to nil to resume
|
|
136
|
+
# that source-tracking. Overrides Image's plain `attr_accessor`, which wrote
|
|
137
|
+
# `@width` directly and was silently reset by the next animation tick.
|
|
138
|
+
def width=(w)
|
|
139
|
+
@user_width = w
|
|
140
|
+
@width = w
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Set the displayed height. See `width=` — persists across frames; nil resumes
|
|
144
|
+
# source-tracking.
|
|
145
|
+
def height=(h)
|
|
146
|
+
@user_height = h
|
|
147
|
+
@height = h
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Whether the current animation loops
|
|
151
|
+
def looping?
|
|
152
|
+
@loop
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Set whether the current animation loops, mid-play, without restarting it
|
|
156
|
+
# (unlike re-calling `play`). Takes effect at the next loop boundary while
|
|
157
|
+
# the animation is still playing: turning it off lets a cycling animation
|
|
158
|
+
# finish — and fire any completion block — when it next reaches the last
|
|
159
|
+
# frame; turning it on keeps it cycling. It does not resume an animation
|
|
160
|
+
# that has already finished and stopped — call `play` to restart that.
|
|
161
|
+
def loop=(value)
|
|
162
|
+
@loop = value ? true : false
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Start playing an animation. Pass `loop:` to override the sprite's default
|
|
166
|
+
# loop setting and a block to run when a non-looping animation finishes.
|
|
72
167
|
def play(animation: :default, loop: nil, flip: nil, &done_proc)
|
|
73
|
-
|
|
168
|
+
anim_name = animation || :default
|
|
169
|
+
|
|
170
|
+
if @playing && anim_name == @playing_animation && flip == @flip
|
|
171
|
+
# Same animation already running (same flip): don't restart it — that
|
|
172
|
+
# would jump back to frame 0 — but still honor an explicitly-passed
|
|
173
|
+
# `loop:` or completion block so callers can adjust them mid-play.
|
|
174
|
+
# Anything left unset is preserved, so a per-frame `play(:state)` call
|
|
175
|
+
# stays a safe no-op.
|
|
176
|
+
@loop = loop ? true : false unless loop.nil?
|
|
177
|
+
@done_proc = done_proc if done_proc
|
|
178
|
+
else
|
|
179
|
+
frames = @animations[anim_name]
|
|
180
|
+
# Validate up front, before mutating any state, so a typo'd or empty
|
|
181
|
+
# animation fails clearly here instead of crashing later in `update`.
|
|
182
|
+
raise Error, "Animation `#{anim_name}` is not defined for this sprite" if frames.nil?
|
|
183
|
+
raise Error, "Animation `#{anim_name}` has no frames" if frames.is_a?(Array) && frames.empty?
|
|
184
|
+
|
|
74
185
|
@playing = true
|
|
75
|
-
@
|
|
186
|
+
@paused = false
|
|
187
|
+
@playing_animation = anim_name
|
|
76
188
|
@done_proc = done_proc
|
|
77
189
|
|
|
78
|
-
|
|
79
|
-
|
|
190
|
+
self.flip = flip
|
|
191
|
+
reset_playing_animation
|
|
80
192
|
|
|
81
193
|
loop = @defaults[:loop] if loop.nil?
|
|
82
194
|
@loop = loop ? true : false
|
|
83
195
|
|
|
84
196
|
set_frame
|
|
85
|
-
|
|
197
|
+
@frame_budget = 0.0 # first frame gets its full duration
|
|
86
198
|
end
|
|
87
199
|
self
|
|
88
200
|
end
|
|
89
201
|
|
|
202
|
+
# Pause the current animation on its current frame. Idempotent and
|
|
203
|
+
# only meaningful while an animation is playing — calling it on an
|
|
204
|
+
# idle sprite is a no-op.
|
|
205
|
+
def pause
|
|
206
|
+
return self unless @playing
|
|
207
|
+
|
|
208
|
+
@playing = false
|
|
209
|
+
@paused = true
|
|
210
|
+
self
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Resume the animation paused by `pause`, picking up at the current
|
|
214
|
+
# frame. The frame budget is reset so the first frame after resume
|
|
215
|
+
# gets its full duration.
|
|
216
|
+
def resume
|
|
217
|
+
return self unless @paused
|
|
218
|
+
|
|
219
|
+
@paused = false
|
|
220
|
+
@playing = true
|
|
221
|
+
@frame_budget = 0.0
|
|
222
|
+
self
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Whether the sprite is currently paused
|
|
226
|
+
def paused?
|
|
227
|
+
@paused == true
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Whether an animation is actively playing. False when idle, paused,
|
|
231
|
+
# or held on the last frame of a finished non-looping animation.
|
|
232
|
+
def playing?
|
|
233
|
+
@playing == true
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Animation rate multiplier — `1.0` runs at the configured `time:`
|
|
237
|
+
# per frame, `2.0` plays twice as fast, `0.5` half-speed. Negative
|
|
238
|
+
# values clamp to 0 (frozen). Reverse playback is not supported.
|
|
239
|
+
def speed=(value)
|
|
240
|
+
v = value.to_f
|
|
241
|
+
@speed = v < 0 ? 0.0 : v
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Set the static frame by name (atlas-backed sprites only). Stops
|
|
245
|
+
# any playing animation, since asserting a static pose is
|
|
246
|
+
# incompatible with continuing a sequence — call `play` afterwards
|
|
247
|
+
# to resume animating.
|
|
248
|
+
def frame=(name)
|
|
249
|
+
raise Error, '`frame=` requires a SpriteSheet source' unless @sheet
|
|
250
|
+
|
|
251
|
+
rect = lookup_sheet_frame(name.to_s)
|
|
252
|
+
|
|
253
|
+
@playing = false
|
|
254
|
+
@paused = false
|
|
255
|
+
@done_proc = nil
|
|
256
|
+
|
|
257
|
+
@clip_x = rect[:x]
|
|
258
|
+
@clip_y = rect[:y]
|
|
259
|
+
@clip_width = rect[:width]
|
|
260
|
+
@clip_height = rect[:height]
|
|
261
|
+
@source_width = rect[:source_width] || @clip_width
|
|
262
|
+
@source_height = rect[:source_height] || @clip_height
|
|
263
|
+
@trim_x = rect[:trim_x] || 0
|
|
264
|
+
@trim_y = rect[:trim_y] || 0
|
|
265
|
+
@width = @user_width || @source_width
|
|
266
|
+
@height = @user_height || @source_height
|
|
267
|
+
@frame = name.to_s
|
|
268
|
+
end
|
|
269
|
+
|
|
90
270
|
# Stop the current animation and set to the default frame
|
|
91
271
|
def stop(animation = nil)
|
|
92
272
|
return unless !animation || animation == @playing_animation
|
|
93
273
|
|
|
94
274
|
@playing = false
|
|
275
|
+
@paused = false
|
|
95
276
|
@playing_animation = @defaults[:animation]
|
|
96
277
|
@current_frame = @defaults[:frame]
|
|
97
278
|
set_frame
|
|
98
279
|
end
|
|
99
280
|
|
|
100
|
-
#
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (!@width || !@height) && flip
|
|
105
|
-
raise Error,
|
|
106
|
-
"Sprite width/height required to flip; occured playing animation `:#{@playing_animation}`
|
|
107
|
-
with image `#{@path}`"
|
|
281
|
+
# Set the flip direction: `:horizontal`, `:vertical`, `:both`, or `nil`
|
|
282
|
+
def flip=(direction)
|
|
283
|
+
if (!@width || !@height) && direction
|
|
284
|
+
raise Error, "Sprite width/height required to flip (animation `:#{@playing_animation}`, image `#{@path}`)"
|
|
108
285
|
end
|
|
109
286
|
|
|
110
|
-
@flip =
|
|
287
|
+
@flip = direction
|
|
111
288
|
end
|
|
112
289
|
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
290
|
+
# Advance the animation by one frame of real time and update the clip rect.
|
|
291
|
+
# Called with no arguments from the scene-graph loop, where `dt` defaults to
|
|
292
|
+
# the engine's shared frame delta (`Window.delta_time`) — the same value an
|
|
293
|
+
# `update do |dt|` block receives. Driving every sprite off that one clock
|
|
294
|
+
# (rather than each polling its own) keeps them in lockstep, lets the engine
|
|
295
|
+
# clamp stalls once, and makes `update(dt)` directly testable. Pass an
|
|
296
|
+
# explicit `dt` (in seconds) to drive the animation by hand.
|
|
297
|
+
def update(dt = UPDATE_DT_UNSET)
|
|
298
|
+
return unless @playing
|
|
120
299
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
case frames
|
|
125
|
-
when Range
|
|
126
|
-
reset_clipping_rect
|
|
127
|
-
@clip_x = @current_frame * @clip_width
|
|
128
|
-
when Array
|
|
129
|
-
_set_explicit_frame frames[@current_frame]
|
|
130
|
-
end
|
|
131
|
-
end
|
|
300
|
+
# Resolve the shared frame delta only now that we know the sprite is
|
|
301
|
+
# playing — the no-arg scene-graph call hits this every frame per sprite.
|
|
302
|
+
dt = Window.delta_time if dt.equal?(UPDATE_DT_UNSET)
|
|
132
303
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
304
|
+
# Bank the elapsed time, scaled by `@speed` (0.0 freezes, 2.0 is double
|
|
305
|
+
# speed), then spend it one whole frame at a time. Looping here — rather
|
|
306
|
+
# than a single step per call — lets a high `speed` skip frames and a long
|
|
307
|
+
# frame catch up, instead of capping at one frame per tick. Each frame is
|
|
308
|
+
# charged its own `time:`, and the unspent remainder stays banked so
|
|
309
|
+
# playback doesn't slowly drift. The budget is in milliseconds.
|
|
310
|
+
@frame_budget += dt * @speed * 1000.0
|
|
137
311
|
|
|
138
|
-
#
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
end
|
|
312
|
+
cycle = @last_frame - @first_frame + 1 # frames in one full loop
|
|
313
|
+
steps = 0
|
|
314
|
+
finished = false
|
|
142
315
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
316
|
+
while @playing && steps < cycle
|
|
317
|
+
ft = @frame_time || @defaults[:frame_time]
|
|
318
|
+
break if ft.nil? || ft <= 0 || @frame_budget < ft
|
|
146
319
|
|
|
147
|
-
|
|
148
|
-
|
|
320
|
+
@frame_budget -= ft
|
|
321
|
+
steps += 1
|
|
149
322
|
@current_frame += 1
|
|
150
|
-
restart_time
|
|
151
|
-
end
|
|
152
323
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
#
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
kept_done_proc.call
|
|
324
|
+
if @current_frame > @last_frame
|
|
325
|
+
if @loop
|
|
326
|
+
@current_frame = @first_frame
|
|
327
|
+
else
|
|
328
|
+
# Hold on the last frame and stop advancing. The user can call
|
|
329
|
+
# `stop` (or `play` something else) to leave the pose. This lets a
|
|
330
|
+
# death animation linger on its corpse pose, a jump animation hold
|
|
331
|
+
# mid-air, an attack hold its follow-through, etc.
|
|
332
|
+
@current_frame = @last_frame
|
|
333
|
+
@playing = false
|
|
334
|
+
finished = true
|
|
165
335
|
end
|
|
166
336
|
end
|
|
337
|
+
set_frame # refresh the clip rect and pick up the next frame's `time:`
|
|
167
338
|
end
|
|
168
339
|
|
|
169
|
-
|
|
340
|
+
# Cap a runaway-fast loop (an absurd `speed`) at one cycle per update so it
|
|
341
|
+
# can't spin; drop the unspent budget rather than letting it grow unbounded.
|
|
342
|
+
@frame_budget = 0.0 if @playing && steps == cycle && @frame_budget >= (@frame_time || @defaults[:frame_time])
|
|
343
|
+
|
|
344
|
+
# Fire the completion block last — after the bookkeeping above — so a
|
|
345
|
+
# `play` chained inside it has the final say. Clear it first so the chained
|
|
346
|
+
# play can install its own block without us seeing a stale reference.
|
|
347
|
+
return unless finished && @done_proc
|
|
348
|
+
|
|
349
|
+
kept_done_proc = @done_proc
|
|
350
|
+
@done_proc = nil
|
|
351
|
+
kept_done_proc.call
|
|
170
352
|
end
|
|
171
353
|
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
#
|
|
175
|
-
#
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
color: [1.0, 1.0, 1.0, 1.0])
|
|
354
|
+
# Render the sprite. With no arguments it draws the same frame the scene
|
|
355
|
+
# graph does (delegating to `_render_scene`) — advancing the animation and
|
|
356
|
+
# drawing the current frame. Called with overrides for one-shot rendering
|
|
357
|
+
# inside a render block (one-shot does not advance the animation).
|
|
358
|
+
def render(x: nil, y: nil, width: nil, height: nil, rotate: nil,
|
|
359
|
+
clip_x: nil, clip_y: nil, clip_width: nil, clip_height: nil,
|
|
360
|
+
tint: nil, opacity: nil)
|
|
361
|
+
if x.nil? && y.nil? && width.nil? && height.nil? && rotate.nil? &&
|
|
362
|
+
clip_x.nil? && clip_y.nil? && clip_width.nil? && clip_height.nil? &&
|
|
363
|
+
tint.nil? && opacity.nil?
|
|
364
|
+
return _render_scene
|
|
365
|
+
end
|
|
185
366
|
|
|
186
367
|
Window.render_ready_check
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
368
|
+
|
|
369
|
+
saved_x, saved_y = @x, @y
|
|
370
|
+
saved_width, saved_height = @width, @height
|
|
371
|
+
saved_rotate = @rotate
|
|
372
|
+
saved_clip_x, saved_clip_y = @clip_x, @clip_y
|
|
373
|
+
saved_clip_width, saved_clip_height = @clip_width, @clip_height
|
|
374
|
+
saved_source_w, saved_source_h = @source_width, @source_height
|
|
375
|
+
saved_trim_x, saved_trim_y = @trim_x, @trim_y
|
|
376
|
+
saved_color = @color
|
|
377
|
+
|
|
378
|
+
@x = x if x
|
|
379
|
+
@y = y if y
|
|
380
|
+
@width = width if width
|
|
381
|
+
@height = height if height
|
|
382
|
+
@rotate = rotate if rotate
|
|
383
|
+
@clip_x = clip_x if clip_x
|
|
384
|
+
@clip_y = clip_y if clip_y
|
|
385
|
+
@clip_width = clip_width if clip_width
|
|
386
|
+
@clip_height = clip_height if clip_height
|
|
387
|
+
|
|
388
|
+
# Override draws use no trim — the caller is being explicit about
|
|
389
|
+
# source rect and display size, so collapse the trim math to the
|
|
390
|
+
# straightforward `draw clip into (x, y, width, height)` case.
|
|
391
|
+
@source_width = @clip_width
|
|
392
|
+
@source_height = @clip_height
|
|
393
|
+
@trim_x = 0
|
|
394
|
+
@trim_y = 0
|
|
395
|
+
|
|
396
|
+
if tint || opacity
|
|
397
|
+
@color = tint ? Color.new(tint) : Color.new(saved_color)
|
|
398
|
+
@color.opacity = opacity if opacity
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
begin
|
|
402
|
+
Ext.image_draw(self)
|
|
403
|
+
ensure
|
|
404
|
+
@x, @y = saved_x, saved_y
|
|
405
|
+
@width, @height = saved_width, saved_height
|
|
406
|
+
@rotate = saved_rotate
|
|
407
|
+
@clip_x, @clip_y = saved_clip_x, saved_clip_y
|
|
408
|
+
@clip_width, @clip_height = saved_clip_width, saved_clip_height
|
|
409
|
+
@source_width, @source_height = saved_source_w, saved_source_h
|
|
410
|
+
@trim_x, @trim_y = saved_trim_x, saved_trim_y
|
|
411
|
+
@color = saved_color
|
|
412
|
+
end
|
|
195
413
|
end
|
|
196
414
|
|
|
197
415
|
private
|
|
198
416
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
height: @clip_height,
|
|
206
|
-
image_width: @img_width,
|
|
207
|
-
image_height: @img_height
|
|
208
|
-
})
|
|
417
|
+
# Scene-graph draw hook (see Renderable#_render_scene): advance the
|
|
418
|
+
# animation and draw the current frame, minus `render`'s keyword handling
|
|
419
|
+
# — a zero-arg call into the 11-keyword `render` still pays ~5µs of
|
|
420
|
+
# keyword setup on wasm mruby, half a millisecond per frame at 100 sprites.
|
|
421
|
+
def _render_scene
|
|
422
|
+
_resolve_alignment
|
|
209
423
|
update
|
|
210
|
-
|
|
211
|
-
|
|
424
|
+
Ext.image_draw(self)
|
|
425
|
+
end
|
|
426
|
+
public :_render_scene
|
|
427
|
+
|
|
428
|
+
# Reset frame to defaults
|
|
429
|
+
def reset_clipping_rect
|
|
430
|
+
@clip_x = @defaults[:clip_x]
|
|
431
|
+
@clip_y = @defaults[:clip_y]
|
|
432
|
+
@clip_width = @defaults[:clip_width]
|
|
433
|
+
@clip_height = @defaults[:clip_height]
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
# Set the position of the clipping retangle based on the current frame
|
|
437
|
+
def set_frame
|
|
438
|
+
frames = @animations[@playing_animation]
|
|
439
|
+
case frames
|
|
440
|
+
when Range
|
|
441
|
+
reset_clipping_rect
|
|
442
|
+
@clip_x = @current_frame * @clip_width
|
|
443
|
+
when Array
|
|
444
|
+
set_explicit_frame frames[@current_frame]
|
|
445
|
+
end
|
|
212
446
|
end
|
|
213
447
|
|
|
214
448
|
# Reset the playing animation to the first frame
|
|
215
|
-
def
|
|
449
|
+
def reset_playing_animation
|
|
216
450
|
frames = @animations[@playing_animation]
|
|
217
451
|
case frames
|
|
218
452
|
# When animation is a range, play through frames horizontally
|
|
@@ -220,6 +454,9 @@ module Ruby2D
|
|
|
220
454
|
@first_frame = frames.first || @defaults[:frame]
|
|
221
455
|
@current_frame = frames.first || @defaults[:frame]
|
|
222
456
|
@last_frame = frames.last
|
|
457
|
+
# Range frames carry no per-frame `time:`, so reset to the default
|
|
458
|
+
# rather than inheriting a leftover value from a prior Array animation.
|
|
459
|
+
@frame_time = @defaults[:frame_time]
|
|
223
460
|
# When array...
|
|
224
461
|
when Array
|
|
225
462
|
@first_frame = 0
|
|
@@ -229,42 +466,42 @@ module Ruby2D
|
|
|
229
466
|
end
|
|
230
467
|
|
|
231
468
|
# Set the current frame based on the region/portion of image
|
|
232
|
-
def
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
@
|
|
245
|
-
@
|
|
246
|
-
@
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
@clip_x = clip_x
|
|
250
|
-
@clip_y = clip_y
|
|
251
|
-
@clip_width = clip_width || @img_width
|
|
252
|
-
@clip_height = clip_height || @img_height
|
|
469
|
+
def set_explicit_frame(frame)
|
|
470
|
+
# Defensive: an out-of-range frame index (e.g. a `default:` past the end
|
|
471
|
+
# of the default animation, restored by `stop`) yields nil here. Leave the
|
|
472
|
+
# current frame in place rather than crashing.
|
|
473
|
+
return if frame.nil?
|
|
474
|
+
|
|
475
|
+
@clip_x = frame[:x] .nil? ? @defaults[:clip_x] : frame[:x]
|
|
476
|
+
@clip_y = frame[:y] .nil? ? @defaults[:clip_y] : frame[:y]
|
|
477
|
+
@clip_width = frame[:width] .nil? ? @defaults[:clip_width] : frame[:width]
|
|
478
|
+
@clip_height = frame[:height] .nil? ? @defaults[:clip_height] : frame[:height]
|
|
479
|
+
@frame_time = frame[:time] .nil? ? @defaults[:frame_time] : frame[:time]
|
|
480
|
+
@source_width = frame[:source_width] || @clip_width
|
|
481
|
+
@source_height = frame[:source_height] || @clip_height
|
|
482
|
+
@trim_x = frame[:trim_x] || 0
|
|
483
|
+
@trim_y = frame[:trim_y] || 0
|
|
484
|
+
@width = @user_width || @source_width
|
|
485
|
+
@height = @user_height || @source_height
|
|
253
486
|
end
|
|
254
487
|
|
|
255
488
|
# initialize animation, called by constructor
|
|
256
|
-
def
|
|
257
|
-
@
|
|
489
|
+
def setup_animation
|
|
490
|
+
@frame_budget = 0.0
|
|
258
491
|
@playing = false
|
|
492
|
+
@paused = false
|
|
259
493
|
@last_frame = 0
|
|
260
494
|
@done_proc = nil
|
|
261
495
|
|
|
262
|
-
#
|
|
263
|
-
|
|
496
|
+
# Auto-generate :default only for path-based sprites where the source is
|
|
497
|
+
# a horizontal strip. Atlas sources have arbitrary 2D layouts, so we
|
|
498
|
+
# leave :default to the user.
|
|
499
|
+
@animations[:default] = 0..(@img_width / @clip_width) - 1 unless @sheet
|
|
500
|
+
|
|
501
|
+
default_anim = @animations.empty? ? nil : @animations.first[0]
|
|
264
502
|
|
|
265
|
-
# Set the sprite defaults
|
|
266
503
|
@defaults = {
|
|
267
|
-
animation:
|
|
504
|
+
animation: default_anim,
|
|
268
505
|
frame: @current_frame,
|
|
269
506
|
frame_time: @frame_time,
|
|
270
507
|
clip_x: @clip_x,
|
|
@@ -274,5 +511,59 @@ module Ruby2D
|
|
|
274
511
|
loop: @loop
|
|
275
512
|
}
|
|
276
513
|
end
|
|
514
|
+
|
|
515
|
+
# Resolve frame-name strings against the SpriteSheet so the rest of the
|
|
516
|
+
# class only has to deal with `{x:,y:,width:,height:[,time:]}` rects and
|
|
517
|
+
# numeric Ranges — the same shapes the legacy path-based API uses.
|
|
518
|
+
def normalize_animations(anims)
|
|
519
|
+
result = {}
|
|
520
|
+
anims.each do |name, frames|
|
|
521
|
+
result[name] = case frames
|
|
522
|
+
when Range then frames
|
|
523
|
+
when Array then frames.map { |f| normalize_frame(f) }
|
|
524
|
+
when String then [normalize_frame(frames)]
|
|
525
|
+
else frames
|
|
526
|
+
end
|
|
527
|
+
end
|
|
528
|
+
result
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
def normalize_frame(spec)
|
|
532
|
+
if spec.is_a?(String)
|
|
533
|
+
lookup_sheet_frame(spec).dup
|
|
534
|
+
elsif spec.is_a?(Hash)
|
|
535
|
+
name = spec[:name] || spec['name']
|
|
536
|
+
if name
|
|
537
|
+
rect = lookup_sheet_frame(name).dup
|
|
538
|
+
time = spec[:time] || spec['time']
|
|
539
|
+
rect[:time] = time if time
|
|
540
|
+
rect
|
|
541
|
+
else
|
|
542
|
+
spec
|
|
543
|
+
end
|
|
544
|
+
else
|
|
545
|
+
raise Error, "Invalid animation frame spec: #{spec.inspect}"
|
|
546
|
+
end
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
def lookup_sheet_frame(name)
|
|
550
|
+
raise Error, "Frame `#{name}` requires a SpriteSheet source" unless @sheet
|
|
551
|
+
|
|
552
|
+
rect = @sheet.frame(name) ||
|
|
553
|
+
raise(Error, "Frame `#{name}` not found in sprite sheet `#{@sheet.path}`")
|
|
554
|
+
|
|
555
|
+
if rect[:rotated]
|
|
556
|
+
raise Error,
|
|
557
|
+
"Frame `#{name}` in sprite sheet `#{@sheet.path}` is packed rotated; " \
|
|
558
|
+
'rotated atlas frames are not yet supported. Repack the atlas without rotation.'
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
rect
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
def first_sheet_rect
|
|
565
|
+
first_name = @sheet.frame_names.first
|
|
566
|
+
first_name && lookup_sheet_frame(first_name)
|
|
567
|
+
end
|
|
277
568
|
end
|
|
278
569
|
end
|