kiwiengine 0.0.1-alpha → 0.5.2

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 (438) hide show
  1. package/README.ko.md +550 -0
  2. package/README.md +575 -4
  3. package/examples/collision-test/assets/cat.png +0 -0
  4. package/examples/collision-test/dist/game.js +2 -0
  5. package/examples/collision-test/dist/game.js.LICENSE.txt +35 -0
  6. package/examples/collision-test/index.ts +30 -0
  7. package/examples/dom-particle-test/assets/bird.png +0 -0
  8. package/examples/dom-particle-test/dist/game.js +2 -0
  9. package/examples/dom-particle-test/dist/game.js.LICENSE.txt +35 -0
  10. package/examples/dom-particle-test/index.html +24 -0
  11. package/examples/dom-particle-test/index.ts +27 -0
  12. package/examples/dom-sprite-test/assets/bird.png +0 -0
  13. package/examples/dom-sprite-test/assets/fire.png +0 -0
  14. package/examples/dom-sprite-test/assets/run.png +0 -0
  15. package/examples/dom-sprite-test/dist/game.js +2 -0
  16. package/examples/dom-sprite-test/dist/game.js.LICENSE.txt +35 -0
  17. package/examples/dom-sprite-test/index.html +24 -0
  18. package/examples/dom-sprite-test/index.ts +38 -0
  19. package/examples/dom-test/dist/game.js +2 -0
  20. package/examples/dom-test/dist/game.js.LICENSE.txt +35 -0
  21. package/examples/dom-test/index.html +24 -0
  22. package/examples/dom-test/index.ts +22 -0
  23. package/examples/flappy-cat/assets/bgm/bgm.ogg +0 -0
  24. package/examples/flappy-cat/assets/images/base.png +0 -0
  25. package/examples/flappy-cat/assets/images/bg.png +0 -0
  26. package/examples/flappy-cat/assets/images/cat.png +0 -0
  27. package/examples/flappy-cat/assets/images/pipe-green.png +0 -0
  28. package/examples/flappy-cat/assets/images/pipe-red.png +0 -0
  29. package/examples/flappy-cat/assets/sfx/die.wav +0 -0
  30. package/examples/flappy-cat/assets/sfx/hit.wav +0 -0
  31. package/examples/flappy-cat/assets/sfx/point.wav +0 -0
  32. package/examples/flappy-cat/assets/sfx/wing.wav +0 -0
  33. package/examples/flappy-cat/dist/game.js +0 -0
  34. package/examples/flappy-cat/index.html +24 -0
  35. package/examples/flappy-cat/index.ts +0 -0
  36. package/examples/particle-test/assets/bird.png +0 -0
  37. package/examples/particle-test/dist/game.js +2 -0
  38. package/examples/particle-test/dist/game.js.LICENSE.txt +35 -0
  39. package/examples/particle-test/index.html +24 -0
  40. package/examples/particle-test/index.ts +30 -0
  41. package/examples/renderer-test/dist/game.js +2 -0
  42. package/examples/renderer-test/dist/game.js.LICENSE.txt +35 -0
  43. package/examples/renderer-test/index.html +24 -0
  44. package/examples/renderer-test/index.ts +9 -0
  45. package/examples/simple-battle/assets/bgm/battle.mp3 +0 -0
  46. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  47. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
  48. package/examples/simple-battle/assets/joystick/joystick.png +0 -0
  49. package/examples/simple-battle/assets/joystick/knob.png +0 -0
  50. package/examples/simple-battle/assets/sfx/hero/die/die.wav +0 -0
  51. package/examples/simple-battle/assets/sfx/hero/heal/heal.wav +0 -0
  52. package/examples/simple-battle/assets/sfx/hero/hit/hit1.wav +0 -0
  53. package/examples/simple-battle/assets/sfx/hero/hit/hit2.wav +0 -0
  54. package/examples/simple-battle/assets/sfx/hero/hit/hit3.wav +0 -0
  55. package/examples/simple-battle/assets/sfx/hero/miss/miss1.wav +0 -0
  56. package/examples/simple-battle/assets/sfx/hero/miss/miss2.wav +0 -0
  57. package/examples/simple-battle/assets/sfx/hero/miss/miss3.wav +0 -0
  58. package/examples/simple-battle/assets/sfx/orc/die/die.wav +0 -0
  59. package/examples/simple-battle/assets/sfx/orc/hit/hit1.wav +0 -0
  60. package/examples/simple-battle/assets/sfx/orc/hit/hit2.wav +0 -0
  61. package/examples/simple-battle/assets/sfx/orc/hit/hit3.wav +0 -0
  62. package/examples/simple-battle/assets/sfx/orc/miss/miss1.wav +0 -0
  63. package/examples/simple-battle/assets/sfx/orc/miss/miss2.wav +0 -0
  64. package/examples/simple-battle/assets/sfx/orc/miss/miss3.wav +0 -0
  65. package/examples/simple-battle/assets/spritesheets/hero-atlas.json +289 -0
  66. package/examples/simple-battle/assets/spritesheets/hero.png +0 -0
  67. package/examples/simple-battle/assets/spritesheets/orc-atlas.json +289 -0
  68. package/examples/simple-battle/assets/spritesheets/orc.png +0 -0
  69. package/examples/simple-battle/assets/spritesheets/potion-atlas.json +83 -0
  70. package/examples/simple-battle/assets/spritesheets/potion.png +0 -0
  71. package/examples/simple-battle/dist/game.js +2 -0
  72. package/examples/simple-battle/dist/game.js.LICENSE.txt +35 -0
  73. package/examples/simple-battle/hud/damage-text.ts +45 -0
  74. package/examples/simple-battle/hud/heal-text.ts +45 -0
  75. package/examples/simple-battle/hud/hp-bar.ts +38 -0
  76. package/examples/simple-battle/index.html +24 -0
  77. package/examples/simple-battle/index.ts +41 -0
  78. package/examples/simple-battle/objects/character.ts +95 -0
  79. package/examples/simple-battle/objects/hero.ts +113 -0
  80. package/examples/simple-battle/objects/orc.ts +109 -0
  81. package/examples/simple-battle/objects/potion.ts +29 -0
  82. package/examples/simple-battle/stage.ts +176 -0
  83. package/examples/spine-test/assets/spine/spineboy.atlas +95 -0
  84. package/examples/spine-test/assets/spine/spineboy.png +0 -0
  85. package/examples/spine-test/assets/spine/spineboy.skel +0 -0
  86. package/examples/spine-test/dist/game.js +2 -0
  87. package/examples/spine-test/dist/game.js.LICENSE.txt +35 -0
  88. package/examples/spine-test/index.html +24 -0
  89. package/examples/spine-test/index.ts +29 -0
  90. package/examples/sprite-test/assets/bird.png +0 -0
  91. package/examples/sprite-test/assets/fire.png +0 -0
  92. package/examples/sprite-test/dist/game.js +2 -0
  93. package/examples/sprite-test/dist/game.js.LICENSE.txt +35 -0
  94. package/examples/sprite-test/index.html +24 -0
  95. package/examples/sprite-test/index.ts +41 -0
  96. package/examples/tsconfig.json +2 -1
  97. package/examples/webpack.config.js +14 -3
  98. package/jest.config.ts +10 -0
  99. package/lib/asset/audio.js +47 -11
  100. package/lib/asset/audio.js.map +1 -1
  101. package/lib/asset/loaders/audio.js +3 -3
  102. package/lib/asset/loaders/audio.js.map +1 -1
  103. package/lib/asset/loaders/binary.js +3 -3
  104. package/lib/asset/loaders/binary.js.map +1 -1
  105. package/lib/asset/loaders/bitmap-font.js +71 -0
  106. package/lib/asset/loaders/bitmap-font.js.map +1 -0
  107. package/lib/asset/loaders/font.js +1 -1
  108. package/lib/asset/loaders/font.js.map +1 -1
  109. package/lib/asset/loaders/loader.js +17 -12
  110. package/lib/asset/loaders/loader.js.map +1 -1
  111. package/lib/asset/loaders/spritesheet.js +6 -7
  112. package/lib/asset/loaders/spritesheet.js.map +1 -1
  113. package/lib/asset/loaders/text.js +3 -3
  114. package/lib/asset/loaders/text.js.map +1 -1
  115. package/lib/asset/loaders/texture.js +5 -4
  116. package/lib/asset/loaders/texture.js.map +1 -1
  117. package/lib/asset/preload.js +60 -56
  118. package/lib/asset/preload.js.map +1 -1
  119. package/lib/collision/check-collision.js +804 -0
  120. package/lib/collision/check-collision.js.map +1 -0
  121. package/lib/collision/check-collision.test.js +300 -0
  122. package/lib/collision/check-collision.test.js.map +1 -0
  123. package/lib/collision/colliders.js +8 -0
  124. package/lib/collision/colliders.js.map +1 -0
  125. package/lib/debug.js.map +1 -0
  126. package/lib/dom/dom-animated-sprite.js +121 -0
  127. package/lib/dom/dom-animated-sprite.js.map +1 -0
  128. package/lib/dom/dom-game-object.js +106 -0
  129. package/lib/dom/dom-game-object.js.map +1 -0
  130. package/lib/dom/dom-particle.js +105 -0
  131. package/lib/dom/dom-particle.js.map +1 -0
  132. package/lib/dom/dom-preload.js +43 -0
  133. package/lib/dom/dom-preload.js.map +1 -0
  134. package/lib/dom/dom-sprite.js +40 -0
  135. package/lib/dom/dom-sprite.js.map +1 -0
  136. package/lib/dom/dom-texture-loader.js +36 -0
  137. package/lib/dom/dom-texture-loader.js.map +1 -0
  138. package/lib/dom/dom-utils.js +20 -0
  139. package/lib/dom/dom-utils.js.map +1 -0
  140. package/lib/index copy.js +16 -0
  141. package/lib/index copy.js.map +1 -0
  142. package/lib/index.js +35 -10
  143. package/lib/index.js.map +1 -1
  144. package/lib/input/joystick.js +262 -0
  145. package/lib/input/joystick.js.map +1 -0
  146. package/lib/node/core/dirty-number.js +38 -0
  147. package/lib/node/core/dirty-number.js.map +1 -0
  148. package/lib/node/core/game-node.js +63 -0
  149. package/lib/node/core/game-node.js.map +1 -0
  150. package/lib/node/core/game-object.js +8 -0
  151. package/lib/node/core/game-object.js.map +1 -0
  152. package/lib/node/core/renderable.js +52 -0
  153. package/lib/node/core/renderable.js.map +1 -0
  154. package/lib/node/core/transform.js +59 -0
  155. package/lib/node/core/transform.js.map +1 -0
  156. package/lib/node/core/transformable.js +85 -0
  157. package/lib/node/core/transformable.js.map +1 -0
  158. package/lib/node/ext/animated-sprite.js +96 -0
  159. package/lib/node/ext/animated-sprite.js.map +1 -0
  160. package/lib/node/ext/bitmap-text.js +89 -0
  161. package/lib/node/ext/bitmap-text.js.map +1 -0
  162. package/lib/node/ext/circle.js +28 -0
  163. package/lib/node/ext/circle.js.map +1 -0
  164. package/lib/node/ext/deplay.js +20 -0
  165. package/lib/node/ext/deplay.js.map +1 -0
  166. package/lib/node/ext/dom-container.js +51 -0
  167. package/lib/node/ext/dom-container.js.map +1 -0
  168. package/lib/node/ext/interval.js +20 -0
  169. package/lib/node/ext/interval.js.map +1 -0
  170. package/lib/node/ext/particle.js +98 -0
  171. package/lib/node/ext/particle.js.map +1 -0
  172. package/lib/node/ext/rectangle.js +32 -0
  173. package/lib/node/ext/rectangle.js.map +1 -0
  174. package/lib/node/ext/spine.js +272 -0
  175. package/lib/node/ext/spine.js.map +1 -0
  176. package/lib/node/ext/sprite.js +42 -0
  177. package/lib/node/ext/sprite.js.map +1 -0
  178. package/lib/node/physics/physics-object.js +112 -0
  179. package/lib/node/physics/physics-object.js.map +1 -0
  180. package/lib/node/physics/physics-world.js +27 -0
  181. package/lib/node/physics/physics-world.js.map +1 -0
  182. package/lib/renderer/camera.js +19 -0
  183. package/lib/renderer/camera.js.map +1 -0
  184. package/lib/renderer/container-manager.js +29 -0
  185. package/lib/renderer/container-manager.js.map +1 -0
  186. package/lib/renderer/fps-display.js +18 -0
  187. package/lib/renderer/fps-display.js.map +1 -0
  188. package/lib/renderer/layer.js +12 -0
  189. package/lib/renderer/layer.js.map +1 -0
  190. package/lib/renderer/renderer.js +145 -0
  191. package/lib/renderer/renderer.js.map +1 -0
  192. package/lib/renderer/ticker.js +56 -0
  193. package/lib/renderer/ticker.js.map +1 -0
  194. package/lib/renderer/ticker.test.js +241 -0
  195. package/lib/renderer/ticker.test.js.map +1 -0
  196. package/lib/types/asset/audio.d.ts +5 -4
  197. package/lib/types/asset/audio.d.ts.map +1 -1
  198. package/lib/types/asset/loaders/audio.d.ts +1 -1
  199. package/lib/types/asset/loaders/audio.d.ts.map +1 -1
  200. package/lib/types/asset/loaders/binary.d.ts +1 -1
  201. package/lib/types/asset/loaders/binary.d.ts.map +1 -1
  202. package/lib/types/asset/loaders/bitmap-font.d.ts +16 -0
  203. package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -0
  204. package/lib/types/asset/loaders/font.d.ts +1 -1
  205. package/lib/types/asset/loaders/font.d.ts.map +1 -1
  206. package/lib/types/asset/loaders/loader.d.ts +6 -6
  207. package/lib/types/asset/loaders/loader.d.ts.map +1 -1
  208. package/lib/types/asset/loaders/spritesheet.d.ts +5 -5
  209. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
  210. package/lib/types/asset/loaders/text.d.ts +1 -1
  211. package/lib/types/asset/loaders/text.d.ts.map +1 -1
  212. package/lib/types/asset/loaders/texture.d.ts +2 -2
  213. package/lib/types/asset/loaders/texture.d.ts.map +1 -1
  214. package/lib/types/asset/preload.d.ts +5 -3
  215. package/lib/types/asset/preload.d.ts.map +1 -1
  216. package/lib/types/bitmap-font.js +2 -0
  217. package/lib/types/bitmap-font.js.map +1 -0
  218. package/lib/types/collision/check-collision.d.ts +4 -0
  219. package/lib/types/collision/check-collision.d.ts.map +1 -0
  220. package/lib/types/collision/check-collision.test.d.ts +2 -0
  221. package/lib/types/collision/check-collision.test.d.ts.map +1 -0
  222. package/lib/types/collision/colliders.d.ts +34 -0
  223. package/lib/types/collision/colliders.d.ts.map +1 -0
  224. package/lib/types/debug.d.ts.map +1 -0
  225. package/lib/types/dom/dom-animated-sprite.d.ts +29 -0
  226. package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -0
  227. package/lib/types/dom/dom-game-object.d.ts +44 -0
  228. package/lib/types/dom/dom-game-object.d.ts.map +1 -0
  229. package/lib/types/dom/dom-particle.d.ts +30 -0
  230. package/lib/types/dom/dom-particle.d.ts.map +1 -0
  231. package/lib/types/dom/dom-preload.d.ts +2 -0
  232. package/lib/types/dom/dom-preload.d.ts.map +1 -0
  233. package/lib/types/dom/dom-sprite.d.ts +13 -0
  234. package/lib/types/dom/dom-sprite.d.ts.map +1 -0
  235. package/lib/types/dom/dom-texture-loader.d.ts +8 -0
  236. package/lib/types/dom/dom-texture-loader.d.ts.map +1 -0
  237. package/lib/types/dom/dom-utils.d.ts +3 -0
  238. package/lib/types/dom/dom-utils.d.ts.map +1 -0
  239. package/lib/types/index copy.d.ts +16 -0
  240. package/lib/types/index copy.d.ts.map +1 -0
  241. package/lib/types/index.d.ts +25 -11
  242. package/lib/types/index.d.ts.map +1 -1
  243. package/lib/types/input/joystick.d.ts +28 -0
  244. package/lib/types/input/joystick.d.ts.map +1 -0
  245. package/lib/types/node/core/dirty-number.d.ts +17 -0
  246. package/lib/types/node/core/dirty-number.d.ts.map +1 -0
  247. package/lib/types/node/core/game-node.d.ts +16 -0
  248. package/lib/types/node/core/game-node.d.ts.map +1 -0
  249. package/lib/types/node/core/game-object.d.ts +8 -0
  250. package/lib/types/node/core/game-object.d.ts.map +1 -0
  251. package/lib/types/node/core/renderable.d.ts +22 -0
  252. package/lib/types/node/core/renderable.d.ts.map +1 -0
  253. package/lib/types/node/core/transform.d.ts +25 -0
  254. package/lib/types/node/core/transform.d.ts.map +1 -0
  255. package/lib/types/node/core/transformable.d.ts +44 -0
  256. package/lib/types/node/core/transformable.d.ts.map +1 -0
  257. package/lib/types/node/ext/animated-sprite.d.ts +28 -0
  258. package/lib/types/node/ext/animated-sprite.d.ts.map +1 -0
  259. package/lib/types/node/ext/bitmap-text.d.ts +14 -0
  260. package/lib/types/node/ext/bitmap-text.d.ts.map +1 -0
  261. package/lib/types/node/ext/circle.d.ts +19 -0
  262. package/lib/types/node/ext/circle.d.ts.map +1 -0
  263. package/lib/types/node/ext/deplay.d.ts +8 -0
  264. package/lib/types/node/ext/deplay.d.ts.map +1 -0
  265. package/lib/types/node/ext/dom-container.d.ts +12 -0
  266. package/lib/types/node/ext/dom-container.d.ts.map +1 -0
  267. package/lib/types/node/ext/interval.d.ts +9 -0
  268. package/lib/types/node/ext/interval.d.ts.map +1 -0
  269. package/lib/types/node/ext/particle.d.ts +30 -0
  270. package/lib/types/node/ext/particle.d.ts.map +1 -0
  271. package/lib/types/node/ext/rectangle.d.ts +22 -0
  272. package/lib/types/node/ext/rectangle.d.ts.map +1 -0
  273. package/lib/types/node/ext/spine.d.ts +36 -0
  274. package/lib/types/node/ext/spine.d.ts.map +1 -0
  275. package/lib/types/node/ext/sprite.d.ts +13 -0
  276. package/lib/types/node/ext/sprite.d.ts.map +1 -0
  277. package/lib/types/node/physics/physics-object.d.ts +38 -0
  278. package/lib/types/node/physics/physics-object.d.ts.map +1 -0
  279. package/lib/types/node/physics/physics-world.d.ts +18 -0
  280. package/lib/types/node/physics/physics-world.d.ts.map +1 -0
  281. package/lib/types/renderer/camera.d.ts +13 -0
  282. package/lib/types/renderer/camera.d.ts.map +1 -0
  283. package/lib/types/renderer/container-manager.d.ts +9 -0
  284. package/lib/types/renderer/container-manager.d.ts.map +1 -0
  285. package/lib/types/renderer/fps-display.d.ts +7 -0
  286. package/lib/types/renderer/fps-display.d.ts.map +1 -0
  287. package/lib/types/renderer/layer.d.ts +7 -0
  288. package/lib/types/renderer/layer.d.ts.map +1 -0
  289. package/lib/types/renderer/renderer.d.ts +40 -0
  290. package/lib/types/renderer/renderer.d.ts.map +1 -0
  291. package/lib/types/renderer/ticker.d.ts +6 -0
  292. package/lib/types/renderer/ticker.d.ts.map +1 -0
  293. package/lib/types/renderer/ticker.test.d.ts +40 -0
  294. package/lib/types/renderer/ticker.test.d.ts.map +1 -0
  295. package/lib/types/types/bitmap-font.d.ts +18 -0
  296. package/lib/types/types/bitmap-font.d.ts.map +1 -0
  297. package/lib/types/utils/device.d.ts +2 -0
  298. package/lib/types/utils/device.d.ts.map +1 -0
  299. package/lib/utils/device.js +2 -0
  300. package/lib/utils/device.js.map +1 -0
  301. package/package.json +8 -7
  302. package/src/asset/audio.ts +134 -90
  303. package/src/asset/loaders/audio.ts +19 -19
  304. package/src/asset/loaders/binary.ts +16 -16
  305. package/src/asset/loaders/bitmap-font.ts +85 -0
  306. package/src/asset/loaders/font.ts +14 -14
  307. package/src/asset/loaders/loader.ts +27 -23
  308. package/src/asset/loaders/spritesheet.ts +34 -36
  309. package/src/asset/loaders/text.ts +15 -15
  310. package/src/asset/loaders/texture.ts +29 -28
  311. package/src/asset/preload.ts +75 -64
  312. package/src/collision/check-collision.test.ts +349 -0
  313. package/src/collision/check-collision.ts +821 -0
  314. package/src/collision/colliders.ts +19 -0
  315. package/src/debug.ts +5 -0
  316. package/src/dom/dom-animated-sprite.ts +153 -0
  317. package/src/dom/dom-game-object.ts +131 -0
  318. package/src/dom/dom-particle.ts +151 -0
  319. package/src/dom/dom-preload.ts +54 -0
  320. package/src/dom/dom-sprite.ts +50 -0
  321. package/src/dom/dom-texture-loader.ts +44 -0
  322. package/src/dom/dom-utils.ts +19 -0
  323. package/src/index.ts +46 -13
  324. package/src/input/joystick.ts +316 -0
  325. package/src/node/core/dirty-number.ts +45 -0
  326. package/src/node/core/game-node.ts +74 -0
  327. package/src/node/core/game-object.ts +11 -0
  328. package/src/node/core/renderable.ts +65 -0
  329. package/src/node/core/transform.ts +70 -0
  330. package/src/node/core/transformable.ts +111 -0
  331. package/src/node/ext/animated-sprite.ts +123 -0
  332. package/src/node/ext/bitmap-text.ts +109 -0
  333. package/src/node/ext/circle.ts +40 -0
  334. package/src/node/ext/deplay.ts +24 -0
  335. package/src/node/ext/dom-container.ts +62 -0
  336. package/src/node/ext/interval.ts +24 -0
  337. package/src/node/ext/particle.ts +142 -0
  338. package/src/node/ext/rectangle.ts +51 -0
  339. package/src/node/ext/spine.ts +323 -0
  340. package/src/node/ext/sprite.ts +53 -0
  341. package/src/node/physics/physics-object.ts +156 -0
  342. package/src/node/physics/physics-world.ts +40 -0
  343. package/src/renderer/camera.ts +25 -0
  344. package/src/renderer/container-manager.ts +36 -0
  345. package/src/renderer/fps-display.ts +21 -0
  346. package/src/renderer/layer.ts +15 -0
  347. package/src/renderer/renderer.ts +180 -0
  348. package/src/renderer/ticker.test.ts +325 -0
  349. package/src/renderer/ticker.ts +54 -0
  350. package/src/types/bitmap-font.ts +19 -0
  351. package/src/utils/device.ts +1 -0
  352. package/examples/test-dom/index.ts +0 -21
  353. package/lib/game-object/game-object-physics.js +0 -188
  354. package/lib/game-object/game-object-physics.js.map +0 -1
  355. package/lib/game-object/game-object-rendering.js +0 -35
  356. package/lib/game-object/game-object-rendering.js.map +0 -1
  357. package/lib/game-object/game-object.js +0 -162
  358. package/lib/game-object/game-object.js.map +0 -1
  359. package/lib/game-object/transform.js +0 -118
  360. package/lib/game-object/transform.js.map +0 -1
  361. package/lib/game-object-ext/animated-sprite.js +0 -117
  362. package/lib/game-object-ext/animated-sprite.js.map +0 -1
  363. package/lib/game-object-ext/dom-container.js +0 -56
  364. package/lib/game-object-ext/dom-container.js.map +0 -1
  365. package/lib/game-object-ext/rect.js +0 -30
  366. package/lib/game-object-ext/rect.js.map +0 -1
  367. package/lib/game-object-ext/spine.js +0 -206
  368. package/lib/game-object-ext/spine.js.map +0 -1
  369. package/lib/game-object-ext/sprite.js +0 -46
  370. package/lib/game-object-ext/sprite.js.map +0 -1
  371. package/lib/game-object-ext/text.js +0 -68
  372. package/lib/game-object-ext/text.js.map +0 -1
  373. package/lib/game-object-ext/tiling-sprite.js +0 -64
  374. package/lib/game-object-ext/tiling-sprite.js.map +0 -1
  375. package/lib/types/game-object/game-object-physics.d.ts +0 -42
  376. package/lib/types/game-object/game-object-physics.d.ts.map +0 -1
  377. package/lib/types/game-object/game-object-rendering.d.ts +0 -15
  378. package/lib/types/game-object/game-object-rendering.d.ts.map +0 -1
  379. package/lib/types/game-object/game-object.d.ts +0 -81
  380. package/lib/types/game-object/game-object.d.ts.map +0 -1
  381. package/lib/types/game-object/transform.d.ts +0 -43
  382. package/lib/types/game-object/transform.d.ts.map +0 -1
  383. package/lib/types/game-object-ext/animated-sprite.d.ts +0 -29
  384. package/lib/types/game-object-ext/animated-sprite.d.ts.map +0 -1
  385. package/lib/types/game-object-ext/dom-container.d.ts +0 -16
  386. package/lib/types/game-object-ext/dom-container.d.ts.map +0 -1
  387. package/lib/types/game-object-ext/rect.d.ts +0 -17
  388. package/lib/types/game-object-ext/rect.d.ts.map +0 -1
  389. package/lib/types/game-object-ext/spine.d.ts +0 -35
  390. package/lib/types/game-object-ext/spine.d.ts.map +0 -1
  391. package/lib/types/game-object-ext/sprite.d.ts +0 -14
  392. package/lib/types/game-object-ext/sprite.d.ts.map +0 -1
  393. package/lib/types/game-object-ext/text.d.ts +0 -26
  394. package/lib/types/game-object-ext/text.d.ts.map +0 -1
  395. package/lib/types/game-object-ext/tiling-sprite.d.ts +0 -20
  396. package/lib/types/game-object-ext/tiling-sprite.d.ts.map +0 -1
  397. package/lib/types/utils/debug.d.ts.map +0 -1
  398. package/lib/types/utils/go.d.ts +0 -26
  399. package/lib/types/utils/go.d.ts.map +0 -1
  400. package/lib/types/world/world-debug.d.ts +0 -11
  401. package/lib/types/world/world-debug.d.ts.map +0 -1
  402. package/lib/types/world/world-physics.d.ts +0 -16
  403. package/lib/types/world/world-physics.d.ts.map +0 -1
  404. package/lib/types/world/world-rendering.d.ts +0 -28
  405. package/lib/types/world/world-rendering.d.ts.map +0 -1
  406. package/lib/types/world/world.d.ts +0 -38
  407. package/lib/types/world/world.d.ts.map +0 -1
  408. package/lib/utils/debug.js.map +0 -1
  409. package/lib/utils/go.js +0 -33
  410. package/lib/utils/go.js.map +0 -1
  411. package/lib/world/world-debug.js +0 -89
  412. package/lib/world/world-debug.js.map +0 -1
  413. package/lib/world/world-physics.js +0 -45
  414. package/lib/world/world-physics.js.map +0 -1
  415. package/lib/world/world-rendering.js +0 -123
  416. package/lib/world/world-rendering.js.map +0 -1
  417. package/lib/world/world.js +0 -147
  418. package/lib/world/world.js.map +0 -1
  419. package/src/game-object/game-object-physics.ts +0 -191
  420. package/src/game-object/game-object-rendering.ts +0 -27
  421. package/src/game-object/game-object.ts +0 -190
  422. package/src/game-object/transform.ts +0 -164
  423. package/src/game-object-ext/animated-sprite.ts +0 -140
  424. package/src/game-object-ext/dom-container.ts +0 -67
  425. package/src/game-object-ext/rect.ts +0 -40
  426. package/src/game-object-ext/spine.ts +0 -235
  427. package/src/game-object-ext/sprite.ts +0 -55
  428. package/src/game-object-ext/text.ts +0 -83
  429. package/src/game-object-ext/tiling-sprite.ts +0 -73
  430. package/src/utils/debug.ts +0 -5
  431. package/src/utils/go.ts +0 -53
  432. package/src/world/world-debug.ts +0 -114
  433. package/src/world/world-physics.ts +0 -52
  434. package/src/world/world-rendering.ts +0 -145
  435. package/src/world/world.ts +0 -171
  436. /package/examples/{test-dom → collision-test}/index.html +0 -0
  437. /package/lib/{utils/debug.js → debug.js} +0 -0
  438. /package/lib/types/{utils/debug.d.ts → debug.d.ts} +0 -0
@@ -1,176 +1,220 @@
1
- import { audioLoader } from './loaders/audio';
1
+ import { isMobile } from '../utils/device'
2
+ import { audioLoader } from './loaders/audio'
2
3
 
3
- const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();
4
- window.addEventListener('mousedown', () => audioContext.resume());
5
- window.addEventListener('touchend', () => audioContext.resume());
4
+ export const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()
5
+ window.addEventListener('mousedown', () => audioContext.resume())
6
+ window.addEventListener('touchend', () => audioContext.resume())
6
7
 
7
8
  async function getAvailableContext(): Promise<AudioContext> {
8
- if (audioContext.state === 'suspended') await audioContext.resume();
9
- return audioContext;
9
+ if (audioContext.state === 'suspended') await audioContext.resume()
10
+ return audioContext
10
11
  }
11
12
 
12
- const isMobile = /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
13
- let isPageVisible = !document.hidden;
14
- window.addEventListener('visibilitychange', () => isPageVisible = !document.hidden);
13
+ let isPageVisible = !document.hidden
14
+ window.addEventListener('visibilitychange', () => isPageVisible = !document.hidden)
15
+
16
+ type BasicStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>
17
+
18
+ type SafeStorage = BasicStorage & {
19
+ persistent: boolean
20
+ }
21
+
22
+ function createSafeStorage(): SafeStorage {
23
+ const memory = (() => {
24
+ const m = new Map<string, string>()
25
+ const api: SafeStorage = {
26
+ persistent: false,
27
+ getItem: (k) => (m.has(k) ? m.get(k)! : null),
28
+ setItem: (k, v) => { m.set(k, String(v)) },
29
+ removeItem: (k) => { m.delete(k) },
30
+ }
31
+ return api
32
+ })()
33
+
34
+ if (typeof window === 'undefined') return memory
35
+
36
+ try {
37
+ const ls = window.localStorage
38
+ const probeKey = '__safe_ls_probe__' + Math.random().toString(36).slice(2)
39
+ ls.setItem(probeKey, '1')
40
+ ls.removeItem(probeKey)
41
+
42
+ const safe: SafeStorage = {
43
+ persistent: true,
44
+ getItem: (k) => ls.getItem(k),
45
+ setItem: (k, v) => ls.setItem(k, v),
46
+ removeItem: (k) => ls.removeItem(k),
47
+ }
48
+ return safe
49
+ } catch {
50
+ return memory
51
+ }
52
+ }
53
+
54
+ const safeStorage = createSafeStorage()
15
55
 
16
56
  class Audio {
17
- src: string;
18
- #volume: number;
19
- #loop: boolean;
57
+ src: string
58
+ #volume: number
59
+ #loop: boolean
20
60
 
21
- #audioBuffer?: AudioBuffer;
22
- #audioContext?: AudioContext;
23
- #gainNode?: GainNode;
24
- #source?: AudioBufferSourceNode;
61
+ #audioBuffer?: AudioBuffer
62
+ #audioContext?: AudioContext
63
+ #gainNode?: GainNode
64
+ #source?: AudioBufferSourceNode
25
65
 
26
- #isPlaying = false;
27
- #isPaused = false;
28
- #startTime = 0;
29
- #pauseTime = 0;
30
- #offset = 0;
66
+ #isPlaying = false
67
+ #isPaused = false
68
+ #startTime = 0
69
+ #pauseTime = 0
70
+ #offset = 0
31
71
 
32
72
  constructor(src: string, volume: number, loop: boolean) {
33
- this.src = src;
34
- this.#volume = volume;
35
- this.#loop = loop;
36
- this.play();
73
+ this.src = src
74
+ this.#volume = volume
75
+ this.#loop = loop
76
+ this.play()
37
77
  }
38
78
 
39
- get volume() { return this.#volume; }
79
+ get volume() { return this.#volume }
40
80
  set volume(volume: number) {
41
- this.#volume = volume;
42
- if (this.#gainNode) this.#gainNode.gain.value = Math.max(0, Math.min(1, volume));
81
+ this.#volume = volume
82
+ if (this.#gainNode) this.#gainNode.gain.value = Math.max(0, Math.min(1, volume))
43
83
  }
44
84
 
45
85
  async play() {
46
- if (isMobile && !isPageVisible) return;
86
+ if (isMobile && !isPageVisible) return
47
87
 
48
88
  if (!this.#audioBuffer) {
49
- if (!audioLoader.checkLoaded(this.src)) {
50
- console.info(`Audio not preloaded. Loading now: ${this.src}`);
89
+ if (audioLoader.checkCached(this.src)) {
90
+ this.#audioBuffer = audioLoader.getCached(this.src)
91
+ } else {
92
+ console.info(`Audio not preloaded. Loading now: ${this.src}`)
93
+ this.#audioBuffer = await audioLoader.load(this.src)
51
94
  }
52
- this.#audioBuffer = await audioLoader.load(this.src);
53
95
  }
54
- if (!this.#audioBuffer) return;
96
+ if (!this.#audioBuffer) return
55
97
 
56
- if (this.#isPlaying) this.stop();
57
- if (!this.#isPaused) this.#offset = 0;
58
- this.#isPlaying = true;
59
- this.#isPaused = false;
60
- if (!this.#audioContext) this.#audioContext = await getAvailableContext();
61
- if (!this.#isPlaying) return;
98
+ if (this.#isPlaying) this.stop()
99
+ if (!this.#isPaused) this.#offset = 0
100
+ this.#isPlaying = true
101
+ this.#isPaused = false
102
+ if (!this.#audioContext) this.#audioContext = await getAvailableContext()
103
+ if (!this.#isPlaying) return
62
104
 
63
105
  if (!this.#gainNode) {
64
- this.#gainNode = this.#audioContext.createGain();
65
- this.#gainNode.gain.value = this.#volume;
66
- this.#gainNode.connect(this.#audioContext.destination);
106
+ this.#gainNode = this.#audioContext.createGain()
107
+ this.#gainNode.gain.value = this.#volume
108
+ this.#gainNode.connect(this.#audioContext.destination)
67
109
  }
68
110
 
69
- this.#source = this.#audioContext.createBufferSource();
70
- this.#source.buffer = this.#audioBuffer;
71
- this.#source.loop = this.#loop;
72
- this.#source.connect(this.#gainNode);
73
- this.#source.start(0, this.#offset);
74
- this.#startTime = this.#audioContext.currentTime;
75
- this.#source.onended = () => { if (!this.#isPaused && !this.#loop) this.stop(); };
111
+ this.#source = this.#audioContext.createBufferSource()
112
+ this.#source.buffer = this.#audioBuffer
113
+ this.#source.loop = this.#loop
114
+ this.#source.connect(this.#gainNode)
115
+ this.#source.start(0, this.#offset)
116
+ this.#startTime = this.#audioContext.currentTime
117
+ this.#source.onended = () => { if (!this.#isPaused && !this.#loop) this.stop() }
76
118
  }
77
119
 
78
120
  #clear(): void {
79
121
  if (this.#source) {
80
- this.#source.stop();
81
- this.#source.disconnect();
82
- this.#source = undefined;
122
+ this.#source.stop()
123
+ this.#source.disconnect()
124
+ this.#source = undefined
83
125
  }
84
126
  }
85
127
 
86
128
  pause() {
87
129
  if (this.#isPlaying && !this.#isPaused) {
88
130
  if (this.#audioContext) {
89
- this.#pauseTime = this.#audioContext.currentTime;
90
- this.#offset += this.#pauseTime - this.#startTime;
131
+ this.#pauseTime = this.#audioContext.currentTime
132
+ this.#offset += this.#pauseTime - this.#startTime
91
133
  }
92
- this.#isPaused = true;
93
- this.#isPlaying = false;
94
- this.#clear();
134
+ this.#isPaused = true
135
+ this.#isPlaying = false
136
+ this.#clear()
95
137
  }
96
138
  }
97
139
 
98
140
  stop() {
99
- this.#isPlaying = false;
100
- this.#isPaused = false;
101
- this.#offset = 0;
102
- this.#clear();
141
+ this.#isPlaying = false
142
+ this.#isPaused = false
143
+ this.#offset = 0
144
+ this.#clear()
103
145
  }
104
146
  }
105
147
 
106
148
  class MusicPlayer {
107
- #volume = 0.7;
108
- #currentAudio?: Audio;
149
+ #volume = 0.7
150
+ #currentAudio?: Audio
109
151
 
110
152
  constructor() {
111
- const stored = parseFloat(localStorage.getItem('musicVolume') || '');
112
- this.#volume = Number.isNaN(stored) ? this.#volume : stored;
153
+ const stored = parseFloat(safeStorage.getItem('musicVolume') || '')
154
+ this.#volume = Number.isNaN(stored) ? this.#volume : stored
113
155
 
114
156
  if (isMobile) {
115
157
  document.addEventListener('visibilitychange', () => {
116
- if (document.hidden) this.pause();
158
+ if (document.hidden) this.pause()
117
159
  else {
118
- isPageVisible = true;
119
- this.#currentAudio?.play();
160
+ isPageVisible = true
161
+ this.#currentAudio?.play()
120
162
  }
121
- });
163
+ })
122
164
  }
123
165
  }
124
166
 
125
167
  get volume() {
126
- return this.#volume;
168
+ return this.#volume
127
169
  }
128
170
 
129
171
  set volume(volume: number) {
130
- this.#volume = volume;
131
- localStorage.setItem('musicVolume', volume.toString());
132
- if (this.#currentAudio) this.#currentAudio.volume = volume;
172
+ this.#volume = volume
173
+ safeStorage.setItem('musicVolume', volume.toString())
174
+ if (this.#currentAudio) this.#currentAudio.volume = volume
133
175
  }
134
176
 
135
177
  play(src: string) {
136
- if (this.#currentAudio?.src === src) return;
137
- this.#currentAudio?.stop();
138
- this.#currentAudio = new Audio(src, this.#volume, true);
178
+ if (this.#currentAudio?.src === src) return
179
+ this.#currentAudio?.stop()
180
+ this.#currentAudio = new Audio(src, this.#volume, true)
139
181
  }
140
182
 
141
183
  pause() {
142
- this.#currentAudio?.pause();
184
+ this.#currentAudio?.pause()
143
185
  }
144
186
 
145
187
  stop() {
146
- this.#currentAudio?.stop();
147
- this.#currentAudio = undefined;
188
+ this.#currentAudio?.stop()
189
+ this.#currentAudio = undefined
148
190
  }
149
191
  }
150
192
 
151
193
  class SfxPlayer {
152
- #volume = 1;
194
+ #volume = 1
153
195
 
154
196
  constructor() {
155
- const stored = parseFloat(localStorage.getItem('sfxVolume') || '');
156
- this.#volume = Number.isNaN(stored) ? this.#volume : stored;
197
+ const stored = parseFloat(safeStorage.getItem('sfxVolume') || '')
198
+ this.#volume = Number.isNaN(stored) ? this.#volume : stored
157
199
  }
158
200
 
159
201
  get volume() {
160
- return this.#volume;
202
+ return this.#volume
161
203
  }
162
204
 
163
205
  set volume(volume: number) {
164
- this.#volume = volume;
165
- localStorage.setItem('sfxVolume', volume.toString());
206
+ this.#volume = volume
207
+ safeStorage.setItem('sfxVolume', volume.toString())
166
208
  }
167
209
 
168
210
  play(src: string) {
169
- new Audio(src, this.#volume, false);
211
+ new Audio(src, this.#volume, false)
170
212
  }
171
- }
172
213
 
173
- const musicPlayer = new MusicPlayer();
174
- const sfxPlayer = new SfxPlayer();
214
+ playRandom(...srcs: string[]) {
215
+ this.play(srcs[Math.floor(Math.random() * srcs.length)])
216
+ }
217
+ }
175
218
 
176
- export { audioContext, musicPlayer, sfxPlayer };
219
+ export const musicPlayer = new MusicPlayer()
220
+ export const sfxPlayer = new SfxPlayer()
@@ -1,39 +1,39 @@
1
- import { audioContext } from '../audio';
2
- import { Loader } from './loader';
1
+ import { audioContext } from '../audio'
2
+ import { Loader } from './loader'
3
3
 
4
4
  class AudioLoader extends Loader<AudioBuffer> {
5
- protected override async _load(src: string) {
5
+ protected override async doLoad(src: string) {
6
6
  const loadingPromise = (async () => {
7
- const response = await fetch(src);
7
+ const response = await fetch(src)
8
8
  if (!response.ok) {
9
- console.error(`Failed to load audio data: ${src}`);
10
- return;
9
+ console.error(`Failed to load audio data: ${src}`)
10
+ return
11
11
  }
12
12
 
13
- const arrayBuffer = await response.arrayBuffer();
13
+ const arrayBuffer = await response.arrayBuffer()
14
14
 
15
15
  try {
16
- const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
16
+ const audioBuffer = await audioContext.decodeAudioData(arrayBuffer)
17
17
 
18
- this.loadingPromises.delete(src);
18
+ this.loadingPromises.delete(src)
19
19
 
20
20
  if (this.hasActiveRef(src)) {
21
- if (this.loadedAssets.has(src)) {
22
- console.error(`Audio buffer already exists: ${src}`);
21
+ if (this.cachedAssets.has(src)) {
22
+ console.error(`Audio buffer already exists: ${src}`)
23
23
  } else {
24
- this.loadedAssets.set(src, audioBuffer);
25
- return audioBuffer;
24
+ this.cachedAssets.set(src, audioBuffer)
25
+ return audioBuffer
26
26
  }
27
27
  }
28
28
  } catch (error) {
29
- console.error(`Failed to decode audio data: ${src}`, error);
30
- this.loadingPromises.delete(src);
29
+ console.error(`Failed to decode audio data: ${src}`, error)
30
+ this.loadingPromises.delete(src)
31
31
  }
32
- })();
32
+ })()
33
33
 
34
- this.loadingPromises.set(src, loadingPromise);
35
- return await loadingPromise;
34
+ this.loadingPromises.set(src, loadingPromise)
35
+ return await loadingPromise
36
36
  }
37
37
  }
38
38
 
39
- export const audioLoader = new AudioLoader();
39
+ export const audioLoader = new AudioLoader()
@@ -1,32 +1,32 @@
1
- import { Loader } from './loader';
1
+ import { Loader } from './loader'
2
2
 
3
3
  class BinaryLoader extends Loader<Uint8Array> {
4
- protected override async _load(src: string) {
4
+ protected override async doLoad(src: string) {
5
5
  const loadingPromise = (async () => {
6
- const response = await fetch(src);
6
+ const response = await fetch(src)
7
7
  if (!response.ok) {
8
- console.error(`Failed to load binary data: ${src}`);
9
- return;
8
+ console.error(`Failed to load binary data: ${src}`)
9
+ return
10
10
  }
11
11
 
12
- const arrayBuffer = await response.arrayBuffer();
13
- const data = new Uint8Array(arrayBuffer);
12
+ const arrayBuffer = await response.arrayBuffer()
13
+ const data = new Uint8Array(arrayBuffer)
14
14
 
15
- this.loadingPromises.delete(src);
15
+ this.loadingPromises.delete(src)
16
16
 
17
17
  if (this.hasActiveRef(src)) {
18
- if (this.loadedAssets.has(src)) {
19
- console.error(`Binary data already exists: ${src}`);
18
+ if (this.cachedAssets.has(src)) {
19
+ console.error(`Binary data already exists: ${src}`)
20
20
  } else {
21
- this.loadedAssets.set(src, data);
22
- return data;
21
+ this.cachedAssets.set(src, data)
22
+ return data
23
23
  }
24
24
  }
25
- })();
25
+ })()
26
26
 
27
- this.loadingPromises.set(src, loadingPromise);
28
- return await loadingPromise;
27
+ this.loadingPromises.set(src, loadingPromise)
28
+ return await loadingPromise
29
29
  }
30
30
  }
31
31
 
32
- export const binaryLoader = new BinaryLoader();
32
+ export const binaryLoader = new BinaryLoader()
@@ -0,0 +1,85 @@
1
+ import { BitmapFont, Char } from '../../types/bitmap-font'
2
+ import { Loader } from './loader'
3
+ import { textureLoader } from './texture'
4
+
5
+ class BitmapFontLoader extends Loader<BitmapFont> {
6
+ #fntToSrc = new Map<string, string>()
7
+
8
+ protected override async doLoad(fnt: string, src: string) {
9
+ this.#fntToSrc.set(fnt, src)
10
+
11
+ const loadingPromise = (async () => {
12
+ const texture = await textureLoader.load(src)
13
+ if (!texture) {
14
+ console.error(`Failed to load texture: ${src}`)
15
+ return
16
+ }
17
+
18
+ const response = await fetch(fnt)
19
+ if (!response.ok) {
20
+ console.error(`Failed to load font xml: ${fnt}`)
21
+ return
22
+ }
23
+
24
+ try {
25
+ const text = await response.text()
26
+
27
+ const parser = new DOMParser()
28
+ const xmlDoc = parser.parseFromString(text, 'application/xml')
29
+
30
+ const infoEl = xmlDoc.getElementsByTagName('info')[0]
31
+ const commonEl = xmlDoc.getElementsByTagName('common')[0]
32
+ const charEls = xmlDoc.getElementsByTagName('char')
33
+
34
+ const size = parseInt(infoEl.getAttribute('size') || '16', 10)
35
+ const lineHeight = parseInt(commonEl.getAttribute('lineHeight') || '32', 10)
36
+
37
+ const chars: Record<number, Char> = {}
38
+
39
+ for (let i = 0; i < charEls.length; i++) {
40
+ const charEl = charEls[i]
41
+
42
+ const id = parseInt(charEl.getAttribute('id')!, 10)
43
+ const x = parseInt(charEl.getAttribute('x')!, 10)
44
+ const y = parseInt(charEl.getAttribute('y')!, 10)
45
+ const width = parseInt(charEl.getAttribute('width')!, 10)
46
+ const height = parseInt(charEl.getAttribute('height')!, 10)
47
+ const xoffset = parseInt(charEl.getAttribute('xoffset')!, 10)
48
+ const yoffset = parseInt(charEl.getAttribute('yoffset')!, 10)
49
+ const xadvance = parseInt(charEl.getAttribute('xadvance')!, 10)
50
+
51
+ chars[id] = { x, y, width, height, xoffset, yoffset, xadvance }
52
+ }
53
+
54
+ this.loadingPromises.delete(fnt)
55
+
56
+ const bitmapFont = { src, chars, texture, size, lineHeight }
57
+ if (this.hasActiveRef(fnt)) {
58
+ if (this.cachedAssets.has(fnt)) {
59
+ textureLoader.release(src)
60
+ console.error(`Bitmap font already exists: ${fnt}`)
61
+ } else {
62
+ this.cachedAssets.set(fnt, bitmapFont)
63
+ return bitmapFont
64
+ }
65
+ } else {
66
+ textureLoader.release(src)
67
+ }
68
+
69
+ } catch (error) {
70
+ console.error(`Failed to decode font xml: ${fnt}`, error)
71
+ this.loadingPromises.delete(fnt)
72
+ }
73
+ })()
74
+
75
+ this.loadingPromises.set(fnt, loadingPromise)
76
+ return await loadingPromise
77
+ }
78
+
79
+ protected override cleanup(fnt: string) {
80
+ const src = this.#fntToSrc.get(fnt)
81
+ if (src) textureLoader.release(src)
82
+ }
83
+ }
84
+
85
+ export const bitmapFontLoader = new BitmapFontLoader()
@@ -1,27 +1,27 @@
1
- import { Loader } from './loader';
1
+ import { Loader } from './loader'
2
2
 
3
3
  class FontFamilyLoader extends Loader<boolean> {
4
- protected override async _load(fontName: string) {
4
+ protected override async doLoad(fontName: string) {
5
5
  const loadingPromise = (async () => {
6
6
  if ('fonts' in document) {
7
7
  try {
8
- await document.fonts.load(`1em ${fontName}`);
9
- await document.fonts.ready;
10
- this.loadingPromises.delete(fontName);
11
- return true;
8
+ await document.fonts.load(`1em ${fontName}`)
9
+ await document.fonts.ready
10
+ this.loadingPromises.delete(fontName)
11
+ return true
12
12
  } catch (error) {
13
- console.error(`Failed to load font: ${fontName}`, error);
14
- this.loadingPromises.delete(fontName);
13
+ console.error(`Failed to load font: ${fontName}`, error)
14
+ this.loadingPromises.delete(fontName)
15
15
  }
16
16
  } else {
17
- console.warn(`This browser does not support the Font Loading API`);
18
- this.loadingPromises.delete(fontName);
17
+ console.warn(`This browser does not support the Font Loading API`)
18
+ this.loadingPromises.delete(fontName)
19
19
  }
20
- })();
20
+ })()
21
21
 
22
- this.loadingPromises.set(fontName, loadingPromise);
23
- return await loadingPromise;
22
+ this.loadingPromises.set(fontName, loadingPromise)
23
+ return await loadingPromise
24
24
  }
25
25
  }
26
26
 
27
- export const fontFamilyLoader = new FontFamilyLoader();
27
+ export const fontFamilyLoader = new FontFamilyLoader()
@@ -1,39 +1,43 @@
1
- abstract class Loader<T> {
2
- protected loadedAssets: Map<string, T> = new Map();
3
- protected loadingPromises: Map<string, Promise<T | undefined>> = new Map();
1
+ export abstract class Loader<T> {
2
+ protected cachedAssets = new Map<string, T>()
3
+ protected loadingPromises = new Map<string, Promise<T | undefined>>()
4
4
 
5
- #refCount: Map<string, number> = new Map();
6
- #incRefCount(id: string) { this.#refCount.set(id, (this.#refCount.get(id) || 0) + 1); }
5
+ #refCount = new Map<string, number>()
6
+ #incRefCount(id: string) { this.#refCount.set(id, (this.#refCount.get(id) || 0) + 1) }
7
7
 
8
- protected hasActiveRef(id: string) { return this.#refCount.get(id)! > 0; }
9
- protected abstract _load(id: string, ...args: any[]): Promise<T | undefined>;
10
- protected _dispose(id: string, asset: T): void { /* override to clean up */ }
8
+ protected hasActiveRef(id: string) { return this.#refCount.get(id)! > 0 }
9
+ protected abstract doLoad(id: string, ...args: any[]): Promise<T | undefined>
10
+ protected cleanup(id: string, asset: T): void { /* override to clean up */ }
11
11
 
12
- checkLoaded(id: string) {
13
- return this.loadedAssets.has(id);
12
+ checkCached(id: string) {
13
+ return this.cachedAssets.has(id)
14
+ }
15
+
16
+ getCached(id: string) {
17
+ if (!this.checkCached(id)) throw new Error(`Asset not found: ${id}`)
18
+ this.#incRefCount(id)
19
+ return this.cachedAssets.get(id)
14
20
  }
15
21
 
16
22
  async load(id: string, ...args: any[]) {
17
- this.#incRefCount(id);
18
- if (this.checkLoaded(id)) return this.loadedAssets.get(id);
19
- if (this.loadingPromises.has(id)) return await this.loadingPromises.get(id);
20
- return await this._load(id, ...args);
23
+ this.#incRefCount(id)
24
+ if (this.checkCached(id)) return this.cachedAssets.get(id)
25
+ if (this.loadingPromises.has(id)) return await this.loadingPromises.get(id)
26
+ return await this.doLoad(id, ...args)
21
27
  }
22
28
 
23
29
  release(id: string) {
24
- const refCount = this.#refCount.get(id);
25
- if (refCount === undefined) throw new Error(`Asset not found: ${id}`);
30
+ const refCount = this.#refCount.get(id)
31
+ if (refCount === undefined) throw new Error(`Asset not found: ${id}`)
26
32
  if (refCount === 1) {
27
- this.#refCount.delete(id);
28
- const asset = this.loadedAssets.get(id);
33
+ this.#refCount.delete(id)
34
+ const asset = this.cachedAssets.get(id)
29
35
  if (asset) {
30
- this._dispose(id, asset);
31
- this.loadedAssets.delete(id);
36
+ this.cleanup(id, asset)
37
+ this.cachedAssets.delete(id)
32
38
  }
33
39
  } else {
34
- this.#refCount.set(id, refCount - 1);
40
+ this.#refCount.set(id, refCount - 1)
35
41
  }
36
42
  }
37
43
  }
38
-
39
- export { Loader };