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.
Files changed (620) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -0
  3. data/README.md +141 -0
  4. data/USAGE.md +2435 -0
  5. data/assets/Rakefile +637 -0
  6. data/assets/build_support/CMakeLists.txt +94 -0
  7. data/assets/build_support/mruby/build_config.rb +34 -0
  8. data/assets/build_support/mruby/build_config_wasm.rb +30 -0
  9. data/assets/build_support/sdl_test.c +174 -0
  10. data/assets/deps.yaml +16 -0
  11. data/assets/platform/include/SDL3/SDL.h +91 -0
  12. data/assets/platform/include/SDL3/SDL_assert.h +705 -0
  13. data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
  14. data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
  15. data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
  16. data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
  17. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
  18. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
  19. data/assets/platform/include/SDL3/SDL_camera.h +535 -0
  20. data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
  21. data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
  22. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
  23. data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
  24. data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
  25. data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
  26. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
  27. data/assets/platform/include/SDL3/SDL_endian.h +645 -0
  28. data/assets/platform/include/SDL3/SDL_error.h +226 -0
  29. data/assets/platform/include/SDL3/SDL_events.h +1645 -0
  30. data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
  31. data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
  32. data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
  33. data/assets/platform/include/SDL3/SDL_guid.h +106 -0
  34. data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
  35. data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
  36. data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
  37. data/assets/platform/include/SDL3/SDL_init.h +507 -0
  38. data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
  39. data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
  40. data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
  41. data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
  42. data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
  43. data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
  44. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
  45. data/assets/platform/include/SDL3/SDL_log.h +541 -0
  46. data/assets/platform/include/SDL3/SDL_main.h +704 -0
  47. data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
  48. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
  49. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
  50. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
  51. data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
  52. data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
  53. data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
  54. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
  55. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
  56. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
  57. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
  58. data/assets/platform/include/SDL3/SDL_pen.h +198 -0
  59. data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
  60. data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
  61. data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
  62. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
  63. data/assets/platform/include/SDL3/SDL_process.h +441 -0
  64. data/assets/platform/include/SDL3/SDL_properties.h +572 -0
  65. data/assets/platform/include/SDL3/SDL_rect.h +528 -0
  66. data/assets/platform/include/SDL3/SDL_render.h +3028 -0
  67. data/assets/platform/include/SDL3/SDL_revision.h +59 -0
  68. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
  69. data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
  70. data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
  71. data/assets/platform/include/SDL3/SDL_storage.h +686 -0
  72. data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
  73. data/assets/platform/include/SDL3/SDL_system.h +840 -0
  74. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
  75. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
  76. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
  77. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
  78. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
  79. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
  80. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
  81. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
  82. data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
  83. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
  84. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
  85. data/assets/platform/include/SDL3/SDL_thread.h +602 -0
  86. data/assets/platform/include/SDL3/SDL_time.h +249 -0
  87. data/assets/platform/include/SDL3/SDL_timer.h +454 -0
  88. data/assets/platform/include/SDL3/SDL_touch.h +184 -0
  89. data/assets/platform/include/SDL3/SDL_tray.h +544 -0
  90. data/assets/platform/include/SDL3/SDL_version.h +198 -0
  91. data/assets/platform/include/SDL3/SDL_video.h +3497 -0
  92. data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
  93. data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
  94. data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
  95. data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
  96. data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
  97. data/assets/{include → platform/include}/mrbconf.h +42 -31
  98. data/assets/{include → platform/include}/mruby/array.h +3 -4
  99. data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
  100. data/assets/platform/include/mruby/boxing_no.h +59 -0
  101. data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
  102. data/assets/platform/include/mruby/class.h +157 -0
  103. data/assets/{include → platform/include}/mruby/common.h +30 -1
  104. data/assets/{include → platform/include}/mruby/compile.h +52 -74
  105. data/assets/{include → platform/include}/mruby/data.h +2 -2
  106. data/assets/{include → platform/include}/mruby/debug.h +12 -5
  107. data/assets/{include → platform/include}/mruby/dump.h +7 -9
  108. data/assets/{include → platform/include}/mruby/endian.h +1 -1
  109. data/assets/platform/include/mruby/error.h +173 -0
  110. data/assets/platform/include/mruby/gc.h +79 -0
  111. data/assets/{include → platform/include}/mruby/hash.h +1 -7
  112. data/assets/platform/include/mruby/internal.h +282 -0
  113. data/assets/platform/include/mruby/irep.h +143 -0
  114. data/assets/{include → platform/include}/mruby/istruct.h +1 -1
  115. data/assets/platform/include/mruby/khash.h +455 -0
  116. data/assets/platform/include/mruby/mempool.h +19 -0
  117. data/assets/{include → platform/include}/mruby/numeric.h +7 -10
  118. data/assets/platform/include/mruby/object.h +51 -0
  119. data/assets/{include → platform/include}/mruby/opcode.h +5 -5
  120. data/assets/{include → platform/include}/mruby/ops.h +19 -6
  121. data/assets/platform/include/mruby/presym/id.h +1447 -0
  122. data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
  123. data/assets/platform/include/mruby/presym/table.h +2893 -0
  124. data/assets/platform/include/mruby/presym.h +65 -0
  125. data/assets/platform/include/mruby/proc.h +184 -0
  126. data/assets/{include → platform/include}/mruby/range.h +0 -2
  127. data/assets/{include → platform/include}/mruby/string.h +33 -53
  128. data/assets/platform/include/mruby/throw.h +81 -0
  129. data/assets/{include → platform/include}/mruby/value.h +64 -29
  130. data/assets/{include → platform/include}/mruby/variable.h +6 -23
  131. data/assets/{include → platform/include}/mruby/version.h +7 -7
  132. data/assets/{include → platform/include}/mruby.h +238 -116
  133. data/assets/platform/macos-arm64/bin/mrbc +0 -0
  134. data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
  135. data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
  136. data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
  137. data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
  138. data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
  139. data/assets/platform/wasm/lib/libFLAC.a +0 -0
  140. data/assets/platform/wasm/lib/libSDL3.a +0 -0
  141. data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
  142. data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
  143. data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
  144. data/assets/platform/wasm/lib/libfreetype.a +0 -0
  145. data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
  146. data/assets/platform/wasm/lib/libmruby.a +0 -0
  147. data/assets/platform/wasm/lib/libogg.a +0 -0
  148. data/assets/platform/wasm/lib/libplutosvg.a +0 -0
  149. data/assets/platform/wasm/lib/libplutovg.a +0 -0
  150. data/assets/platform/wasm/lib/libpng.a +0 -0
  151. data/assets/platform/wasm/lib/libpng16.a +0 -0
  152. data/assets/platform/wasm/lib/libvorbis.a +0 -0
  153. data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
  154. data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
  155. data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
  156. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
  157. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  158. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  159. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  160. data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
  161. data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
  162. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
  163. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  164. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  165. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  166. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
  167. data/assets/resources/fonts/outfit/OFL.txt +93 -0
  168. data/assets/resources/fonts/outfit/outfit.ttf +0 -0
  169. data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
  170. data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
  171. data/assets/resources/icons/icon.icns +0 -0
  172. data/assets/resources/icons/icon.png +0 -0
  173. data/assets/resources/spritesheets/License.txt +28 -0
  174. data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
  175. data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
  176. data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
  177. data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
  178. data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
  179. data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
  180. data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
  181. data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
  182. data/assets/{wasm → resources/web}/template.html +1 -1
  183. data/assets/target.rb +131 -0
  184. data/bin/ruby2d +281 -82
  185. data/examples/astar.rb +269 -0
  186. data/examples/asteroids.rb +403 -0
  187. data/examples/bezier_editor.rb +96 -0
  188. data/examples/boids.rb +191 -0
  189. data/examples/bouncing_balls.rb +119 -0
  190. data/examples/breakout.rb +186 -0
  191. data/examples/constellations.rb +100 -0
  192. data/examples/dashboard.rb +133 -0
  193. data/examples/double_pendulum.rb +254 -0
  194. data/examples/falling_sand.rb +291 -0
  195. data/examples/fireworks.rb +110 -0
  196. data/examples/fluid_dynamics.rb +340 -0
  197. data/examples/fourier_epicycles.rb +142 -0
  198. data/examples/fractal_tree.rb +326 -0
  199. data/examples/game_of_life.rb +148 -0
  200. data/examples/gamepads.rb +333 -0
  201. data/examples/hill_driver.rb +613 -0
  202. data/examples/logo_animation.rb +251 -0
  203. data/examples/lorenz_attractor.rb +115 -0
  204. data/examples/mandelbrot.rb +207 -0
  205. data/examples/marching_squares.rb +200 -0
  206. data/examples/maze.rb +323 -0
  207. data/examples/nbody.rb +338 -0
  208. data/examples/outrun.rb +391 -0
  209. data/examples/pixel_paint.rb +313 -0
  210. data/examples/platformer.rb +335 -0
  211. data/examples/ray_casting_maze.rb +175 -0
  212. data/examples/shadow_casting.rb +151 -0
  213. data/examples/shape_recognizer.rb +908 -0
  214. data/examples/snake.rb +144 -0
  215. data/examples/sprite_sheets.rb +246 -0
  216. data/examples/swarm.rb +206 -0
  217. data/examples/tsp_annealing.rb +104 -0
  218. data/examples/ui_controls.rb +163 -0
  219. data/examples/wireframe_3d.rb +139 -0
  220. data/ext/ruby2d/audio.c +324 -0
  221. data/ext/ruby2d/canvas.c +1715 -494
  222. data/ext/ruby2d/ext.c +541 -0
  223. data/ext/ruby2d/extconf.rb +122 -145
  224. data/ext/ruby2d/font.c +566 -20
  225. data/ext/ruby2d/fps.c +92 -0
  226. data/ext/ruby2d/image.c +466 -41
  227. data/ext/ruby2d/ruby2d.c +374 -1890
  228. data/ext/ruby2d/ruby2d.h +840 -460
  229. data/ext/ruby2d/shapes.c +931 -101
  230. data/ext/ruby2d/text.c +586 -21
  231. data/ext/ruby2d/window.c +1693 -283
  232. data/lib/ruby2d/atlas_parser.rb +194 -0
  233. data/lib/ruby2d/audio.rb +73 -0
  234. data/lib/ruby2d/benchmark.rb +259 -0
  235. data/lib/ruby2d/bitmap_text.rb +155 -0
  236. data/lib/ruby2d/button.rb +402 -0
  237. data/lib/ruby2d/canvas.rb +703 -279
  238. data/lib/ruby2d/circle.rb +206 -29
  239. data/lib/ruby2d/cli/browser.rb +314 -0
  240. data/lib/ruby2d/cli/build.rb +471 -257
  241. data/lib/ruby2d/cli/colorize.rb +7 -5
  242. data/lib/ruby2d/cli/examples.rb +127 -0
  243. data/lib/ruby2d/cli/launch.rb +24 -39
  244. data/lib/ruby2d/cli/lib_files.rb +48 -0
  245. data/lib/ruby2d/cli/messages.rb +40 -0
  246. data/lib/ruby2d/cli/setup.rb +273 -0
  247. data/lib/ruby2d/cli/static_server.rb +160 -0
  248. data/lib/ruby2d/cli/usage.rb +255 -0
  249. data/lib/ruby2d/color.rb +191 -69
  250. data/lib/ruby2d/core.rb +37 -19
  251. data/lib/ruby2d/deps_help.rb +89 -0
  252. data/lib/ruby2d/dsl.rb +51 -12
  253. data/lib/ruby2d/ellipse.rb +228 -0
  254. data/lib/ruby2d/exceptions.rb +0 -2
  255. data/lib/ruby2d/font.rb +34 -74
  256. data/lib/ruby2d/gamepad.rb +323 -0
  257. data/lib/ruby2d/gem_paths.rb +19 -0
  258. data/lib/ruby2d/image.rb +155 -52
  259. data/lib/ruby2d/interactive.rb +103 -0
  260. data/lib/ruby2d/json_parser.rb +268 -0
  261. data/lib/ruby2d/line.rb +194 -85
  262. data/lib/ruby2d/mruby_compat.rb +12 -0
  263. data/lib/ruby2d/polygon.rb +297 -0
  264. data/lib/ruby2d/polyline.rb +368 -0
  265. data/lib/ruby2d/quad.rb +358 -94
  266. data/lib/ruby2d/rectangle.rb +77 -19
  267. data/lib/ruby2d/renderable.rb +411 -11
  268. data/lib/ruby2d/sprite.rb +471 -180
  269. data/lib/ruby2d/sprite_sheet.rb +64 -0
  270. data/lib/ruby2d/square.rb +29 -17
  271. data/lib/ruby2d/text.rb +196 -65
  272. data/lib/ruby2d/tileset.rb +139 -81
  273. data/lib/ruby2d/triangle.rb +324 -89
  274. data/lib/ruby2d/version.rb +1 -3
  275. data/lib/ruby2d/vertices.rb +62 -85
  276. data/lib/ruby2d/warnings.rb +29 -0
  277. data/lib/ruby2d/window/class_methods.rb +218 -0
  278. data/lib/ruby2d/window/gamepad_events.rb +141 -0
  279. data/lib/ruby2d/window/key_events.rb +74 -0
  280. data/lib/ruby2d/window/mouse_events.rb +171 -0
  281. data/lib/ruby2d/window/object_events.rb +168 -0
  282. data/lib/ruby2d/window.rb +632 -585
  283. data/lib/ruby2d.rb +14 -19
  284. metadata +275 -443
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GL/glew.h +0 -26427
  287. data/assets/include/GLES2/gl2.h +0 -656
  288. data/assets/include/GLES2/gl2ext.h +0 -3949
  289. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  290. data/assets/include/GLES2/gl2platform.h +0 -27
  291. data/assets/include/GLES3/gl3.h +0 -1192
  292. data/assets/include/GLES3/gl31.h +0 -1507
  293. data/assets/include/GLES3/gl32.h +0 -1808
  294. data/assets/include/GLES3/gl3platform.h +0 -27
  295. data/assets/include/KHR/khrplatform.h +0 -290
  296. data/assets/include/SDL2/SDL.h +0 -233
  297. data/assets/include/SDL2/SDL_assert.h +0 -326
  298. data/assets/include/SDL2/SDL_atomic.h +0 -415
  299. data/assets/include/SDL2/SDL_audio.h +0 -1500
  300. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  301. data/assets/include/SDL2/SDL_config.h +0 -61
  302. data/assets/include/SDL2/SDL_config_android.h +0 -194
  303. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  304. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  305. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  306. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  307. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  308. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  309. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  310. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  311. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  312. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  313. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  314. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  315. data/assets/include/SDL2/SDL_endian.h +0 -348
  316. data/assets/include/SDL2/SDL_error.h +0 -163
  317. data/assets/include/SDL2/SDL_events.h +0 -1166
  318. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  319. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  320. data/assets/include/SDL2/SDL_gesture.h +0 -117
  321. data/assets/include/SDL2/SDL_guid.h +0 -100
  322. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  323. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  324. data/assets/include/SDL2/SDL_hints.h +0 -2569
  325. data/assets/include/SDL2/SDL_image.h +0 -2173
  326. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  327. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  328. data/assets/include/SDL2/SDL_keycode.h +0 -358
  329. data/assets/include/SDL2/SDL_loadso.h +0 -115
  330. data/assets/include/SDL2/SDL_log.h +0 -404
  331. data/assets/include/SDL2/SDL_main.h +0 -275
  332. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  333. data/assets/include/SDL2/SDL_mouse.h +0 -465
  334. data/assets/include/SDL2/SDL_mutex.h +0 -471
  335. data/assets/include/SDL2/SDL_name.h +0 -33
  336. data/assets/include/SDL2/SDL_pixels.h +0 -644
  337. data/assets/include/SDL2/SDL_platform.h +0 -261
  338. data/assets/include/SDL2/SDL_quit.h +0 -58
  339. data/assets/include/SDL2/SDL_rect.h +0 -376
  340. data/assets/include/SDL2/SDL_render.h +0 -1919
  341. data/assets/include/SDL2/SDL_revision.h +0 -6
  342. data/assets/include/SDL2/SDL_rwops.h +0 -841
  343. data/assets/include/SDL2/SDL_sensor.h +0 -322
  344. data/assets/include/SDL2/SDL_shape.h +0 -155
  345. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  346. data/assets/include/SDL2/SDL_surface.h +0 -997
  347. data/assets/include/SDL2/SDL_system.h +0 -623
  348. data/assets/include/SDL2/SDL_syswm.h +0 -386
  349. data/assets/include/SDL2/SDL_test_images.h +0 -78
  350. data/assets/include/SDL2/SDL_test_random.h +0 -115
  351. data/assets/include/SDL2/SDL_thread.h +0 -464
  352. data/assets/include/SDL2/SDL_timer.h +0 -222
  353. data/assets/include/SDL2/SDL_touch.h +0 -150
  354. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  355. data/assets/include/SDL2/SDL_types.h +0 -29
  356. data/assets/include/SDL2/SDL_version.h +0 -204
  357. data/assets/include/SDL2/SDL_video.h +0 -2150
  358. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  359. data/assets/include/SDL2/begin_code.h +0 -187
  360. data/assets/include/mruby/boxing_no.h +0 -58
  361. data/assets/include/mruby/class.h +0 -108
  362. data/assets/include/mruby/error.h +0 -147
  363. data/assets/include/mruby/gc.h +0 -94
  364. data/assets/include/mruby/irep.h +0 -147
  365. data/assets/include/mruby/khash.h +0 -284
  366. data/assets/include/mruby/object.h +0 -43
  367. data/assets/include/mruby/presym/disable.h +0 -70
  368. data/assets/include/mruby/presym/enable.h +0 -37
  369. data/assets/include/mruby/presym.h +0 -40
  370. data/assets/include/mruby/proc.h +0 -211
  371. data/assets/include/mruby/throw.h +0 -66
  372. data/assets/macos/universal/bin/mrbc +0 -0
  373. data/assets/macos/universal/lib/libFLAC.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  377. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  378. data/assets/macos/universal/lib/libavif.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  380. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  381. data/assets/macos/universal/lib/libfreetype.a +0 -0
  382. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  383. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  384. data/assets/macos/universal/lib/libhwy.a +0 -0
  385. data/assets/macos/universal/lib/libjpeg.a +0 -0
  386. data/assets/macos/universal/lib/libjxl.a +0 -0
  387. data/assets/macos/universal/lib/libmodplug.a +0 -0
  388. data/assets/macos/universal/lib/libmpg123.a +0 -0
  389. data/assets/macos/universal/lib/libmruby.a +0 -0
  390. data/assets/macos/universal/lib/libogg.a +0 -0
  391. data/assets/macos/universal/lib/libpng.a +0 -0
  392. data/assets/macos/universal/lib/libtiff.a +0 -0
  393. data/assets/macos/universal/lib/libvorbis.a +0 -0
  394. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  395. data/assets/macos/universal/lib/libwebp.a +0 -0
  396. data/assets/macos/universal/lib/libzstd.a +0 -0
  397. data/assets/test_media/README.md +0 -3
  398. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  399. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  400. data/assets/test_media/boom.png +0 -0
  401. data/assets/test_media/coin.png +0 -0
  402. data/assets/test_media/colors.png +0 -0
  403. data/assets/test_media/controller.png +0 -0
  404. data/assets/test_media/dial.wav +0 -0
  405. data/assets/test_media/hero.png +0 -0
  406. data/assets/test_media/image.bmp +0 -0
  407. data/assets/test_media/image.jpg +0 -0
  408. data/assets/test_media/image.png +0 -0
  409. data/assets/test_media/music.flac +0 -0
  410. data/assets/test_media/music.mp3 +0 -0
  411. data/assets/test_media/music.ogg +0 -0
  412. data/assets/test_media/music.wav +0 -0
  413. data/assets/test_media/originals/boom.pxm +0 -0
  414. data/assets/test_media/originals/coin.pxm +0 -0
  415. data/assets/test_media/originals/controller.sketch +0 -0
  416. data/assets/test_media/originals/hero.pxm +0 -0
  417. data/assets/test_media/originals/image.pxm +0 -0
  418. data/assets/test_media/originals/music.caf +0 -0
  419. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  420. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  421. data/assets/test_media/sound.flac +0 -0
  422. data/assets/test_media/sound.mp3 +0 -0
  423. data/assets/test_media/sound.ogg +0 -0
  424. data/assets/test_media/sound.wav +0 -0
  425. data/assets/test_media/sprite_sheet.png +0 -0
  426. data/assets/test_media/texture_atlas.png +0 -0
  427. data/assets/wasm/libmruby.a +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  463. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  464. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  492. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  493. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  499. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  500. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  501. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  502. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  503. data/assets/xcode/ios/Info.plist +0 -43
  504. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  533. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  534. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  535. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  539. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  540. data/assets/xcode/ios/main.c +0 -1
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  558. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  559. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  560. data/assets/xcode/tvos/Info.plist +0 -30
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  590. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  591. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  592. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  596. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  597. data/assets/xcode/tvos/main.c +0 -1
  598. data/ext/ruby2d/common.c +0 -185
  599. data/ext/ruby2d/controllers.c +0 -110
  600. data/ext/ruby2d/gl.c +0 -398
  601. data/ext/ruby2d/gl2.c +0 -86
  602. data/ext/ruby2d/gl3.c +0 -304
  603. data/ext/ruby2d/gles.c +0 -302
  604. data/ext/ruby2d/input.c +0 -48
  605. data/ext/ruby2d/music.c +0 -127
  606. data/ext/ruby2d/sound.c +0 -132
  607. data/lib/ruby2d/cli/console.rb +0 -65
  608. data/lib/ruby2d/cli/enable_console.rb +0 -7
  609. data/lib/ruby2d/cli/platform.rb +0 -17
  610. data/lib/ruby2d/music.rb +0 -77
  611. data/lib/ruby2d/pixel.rb +0 -18
  612. data/lib/ruby2d/pixmap.rb +0 -39
  613. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  614. data/lib/ruby2d/sound.rb +0 -61
  615. data/lib/ruby2d/texture.rb +0 -38
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  619. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  620. /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
- # Sprites are special images that can be used to create animations, kind of like a flip book.
7
- # To create a sprite animation, first you’ll need an image which contains each frame of your animation.
8
- class Sprite
9
- include Renderable
10
-
11
- attr_reader :path
12
- attr_accessor :rotate, :loop, :clip_x, :clip_y, :clip_width, :clip_height, :data, :x, :y, :width, :height
13
-
14
- # Create a sprite via single image or sprite-sheet.
15
- # @param path [#to_s] The location of the file to load as an image.
16
- # @param width [Numeric] The +width+ of drawn image, or default is width from image file
17
- # @param height [Numeric] The +height+ of drawn image, or default is height from image file
18
- # @param x [Numeric]
19
- # @param y [Numeric]
20
- # @param z [Numeric]
21
- # @param rotate [Numeric] Angle, default is 0
22
- # @param color [Numeric] (or +colour+) Tint the image when rendering
23
- # @param opacity [Numeric] Opacity of the image when rendering
24
- # @param show [Boolean] If +true+ the image is added to +Window+ automatically.
25
- # @param loop [Boolean] Sets whether animations loop by default when played (can be overridden by +play+ method)
26
- # @param time [Numeric] The default time in millisecond for each frame (unless overridden animation within frames)
27
- # @param animations [Hash{String => Range}, Hash{String=>Array<Hash>}] Sprite sheet map to animations using
28
- # frame ranges or individual frames
29
- # @param default [Numeric] The default initial frame for the sprite
30
- # @param clip_x [Numeric]
31
- # @param clip_x [Numeric]
32
- # @param clip_width [Numeric]
33
- # @param clip_height [Numeric]
34
- def initialize(path, atlas: nil, show: true, width: nil, height: nil,
35
- x: 0, y: 0, z: 0, rotate: 0, color: nil, colour: nil, opacity: nil,
36
- loop: false, time: 300, animations: {}, default: 0,
37
- clip_x: 0, clip_y: 0, clip_width: nil, clip_height: nil)
38
- @path = path.to_s
39
-
40
- # Coordinates, size, and rotation of the sprite
41
- @x = x
42
- @y = y
43
- @z = z
44
- @rotate = rotate
45
- self.color = color || colour || 'white'
46
- self.color.opacity = opacity unless opacity.nil?
47
-
48
- # Dimensions
49
- @width = width
50
- @height = height
51
-
52
- # Flipping status
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
- @animations = animations
68
+ self.speed = speed
69
+ @animations = normalize_animations(animations || {})
59
70
  @current_frame = default
60
71
 
61
- _setup_texture_and_clip_box atlas, clip_x, clip_y, clip_width, clip_height
62
- _setup_animation
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
- # Add the sprite to the window
65
- add if show
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
- # Start playing an animation
69
- # @param animation [String] Name of the animation to play
70
- # @param loop [Boolean] Set the animation to loop or not
71
- # @param flip [nil, :vertical, :horizontal, :both] Direction to flip the sprite if desired
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
- unless @playing && animation == @playing_animation && flip == @flip
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
- @playing_animation = animation || :default
186
+ @paused = false
187
+ @playing_animation = anim_name
76
188
  @done_proc = done_proc
77
189
 
78
- flip_sprite(flip)
79
- _reset_playing_animation
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
- restart_time
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
- # Flip the sprite
101
- # @param flip [nil, :vertical, :horizontal, :both] Direction to flip the sprite if desired
102
- def flip_sprite(flip)
103
- # The sprite width and height must be set for it to be flipped correctly
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 = flip
287
+ @flip = direction
111
288
  end
112
289
 
113
- # Reset frame to defaults
114
- def reset_clipping_rect
115
- @clip_x = @defaults[:clip_x]
116
- @clip_y = @defaults[:clip_y]
117
- @clip_width = @defaults[:clip_width]
118
- @clip_height = @defaults[:clip_height]
119
- end
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
- # Set the position of the clipping retangle based on the current frame
122
- def set_frame
123
- frames = @animations[@playing_animation]
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
- # Calculate the time in ms
134
- def elapsed_time
135
- (Time.now.to_f - @start_time) * 1000
136
- end
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
- # Restart the timer
139
- def restart_time
140
- @start_time = Time.now.to_f
141
- end
312
+ cycle = @last_frame - @first_frame + 1 # frames in one full loop
313
+ steps = 0
314
+ finished = false
142
315
 
143
- # Update the sprite animation, called by `render`
144
- def update
145
- return unless @playing
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
- # Advance the frame
148
- unless elapsed_time <= (@frame_time || @defaults[:frame_time])
320
+ @frame_budget -= ft
321
+ steps += 1
149
322
  @current_frame += 1
150
- restart_time
151
- end
152
323
 
153
- # Reset to the starting frame if all frames played
154
- if @current_frame > @last_frame
155
- @current_frame = @first_frame
156
- unless @loop
157
- # Stop animation and play block, if provided
158
- stop
159
- if @done_proc
160
- # allow proc to make nested `play/do` calls to sequence multiple
161
- # animations by clearing `@done_proc` before the call
162
- kept_done_proc = @done_proc
163
- @done_proc = nil
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
- set_frame
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
- # @param width [Numeric] The +width+ of drawn image
173
- # @param height [Numeric] The +height+ of drawn image
174
- # @param x [Numeric]
175
- # @param y [Numeric]
176
- # @param rotate [Numeric] Angle, default is 0
177
- # @param color [Numeric] (or +colour+) Tint the image when rendering
178
- # @param clip_x [Numeric]
179
- # @param clip_x [Numeric]
180
- # @param clip_width [Numeric]
181
- # @param clip_height [Numeric]
182
- def draw(x:, y:, width: (@width || @clip_width), height: (@height || @clip_height), rotate: @rotate,
183
- clip_x: @clip_x, clip_y: @clip_y, clip_width: @clip_width, clip_height: @clip_height,
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
- render(x: x, y: y, width: width, height: height, color: Color.new(color), rotate: rotate, crop: {
188
- x: clip_x,
189
- y: clip_y,
190
- width: clip_width,
191
- height: clip_height,
192
- image_width: @img_width,
193
- image_height: @img_height
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
- def render(x: @x, y: @y, width: (@width || @clip_width), height: (@height || @clip_height),
200
- color: @color, rotate: @rotate, flip: @flip,
201
- crop: {
202
- x: @clip_x,
203
- y: @clip_y,
204
- width: @clip_width,
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
- vertices = Vertices.new(x, y, width, height, rotate, crop: crop, flip: flip)
211
- @texture.draw vertices.coordinates, vertices.texture_coordinates, color
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 _reset_playing_animation
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 _set_explicit_frame(frame)
233
- @clip_x = frame[:x] || @defaults[:clip_x]
234
- @clip_y = frame[:y] || @defaults[:clip_y]
235
- @clip_width = frame[:width] || @defaults[:clip_width]
236
- @clip_height = frame[:height] || @defaults[:clip_height]
237
- @frame_time = frame[:time] || @defaults[:frame_time]
238
- end
239
-
240
- # initialize texture and clipping, called by constructor
241
- def _setup_texture_and_clip_box(atlas, clip_x, clip_y, clip_width, clip_height)
242
- # Initialize the sprite texture
243
- # Consider input pixmap atlas if supplied to load image file
244
- @texture = Image.load_image_as_texture @path, atlas: atlas
245
- @img_width = @texture.width
246
- @img_height = @texture.height
247
-
248
- # The clipping rectangle
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 _setup_animation
257
- @start_time = 0.0
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
- # Set the default animation
263
- @animations[:default] = 0..(@img_width / @clip_width) - 1
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: @animations.first[0],
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