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
@@ -0,0 +1,272 @@
1
+ import { AtlasAttachmentLoader, Spine as PixiSpine, SkeletonBinary, SkeletonJson, Skin, SpineTexture, TextureAtlas } from '@esotericsoftware/spine-pixi-v8';
2
+ import { binaryLoader } from '../../asset/loaders/binary';
3
+ import { textLoader } from '../../asset/loaders/text';
4
+ import { textureLoader } from '../../asset/loaders/texture';
5
+ import { GameObject } from '../core/game-object';
6
+ export class SpineNode extends GameObject {
7
+ #atlas;
8
+ #texture;
9
+ #rawSkeletonData;
10
+ #skel;
11
+ #json;
12
+ #skins;
13
+ #animation;
14
+ #loop;
15
+ #spine;
16
+ constructor(options) {
17
+ super(options);
18
+ this.#atlas = options.atlas;
19
+ this.#texture = options.texture;
20
+ this.#rawSkeletonData = options.rawSkeletonData;
21
+ this.#skel = options.skel;
22
+ this.#json = options.json;
23
+ this.#skins = options.skins;
24
+ this.#animation = options.animation;
25
+ this.#loop = options.loop;
26
+ this.#load();
27
+ }
28
+ #buildSkeletonData(atlasText, texture, textures, skeletonBinary, textSkeletonData) {
29
+ if (!atlasText)
30
+ return undefined;
31
+ if (!texture && !textures)
32
+ return undefined;
33
+ if (!this.rawSkeletonData && !skeletonBinary && !textSkeletonData)
34
+ return undefined;
35
+ // Create TextureAtlas and bind pages to provided textures
36
+ const atlas = new TextureAtlas(atlasText);
37
+ atlas.pages.forEach((page) => {
38
+ if (texture) {
39
+ page.setTexture(SpineTexture.from(texture.source));
40
+ }
41
+ else if (textures) {
42
+ const t = textures[page.name];
43
+ if (!t)
44
+ throw new Error(`Missing texture for atlas page: ${page.name}`);
45
+ page.setTexture(SpineTexture.from(t.source));
46
+ }
47
+ });
48
+ const atlasLoader = new AtlasAttachmentLoader(atlas);
49
+ // Parse skeleton data depending on available source
50
+ if (this.rawSkeletonData) {
51
+ const jsonLoader = new SkeletonJson(atlasLoader);
52
+ return jsonLoader.readSkeletonData(this.rawSkeletonData);
53
+ }
54
+ if (skeletonBinary) {
55
+ const binLoader = new SkeletonBinary(atlasLoader);
56
+ return binLoader.readSkeletonData(skeletonBinary);
57
+ }
58
+ if (textSkeletonData) {
59
+ const jsonLoader = new SkeletonJson(atlasLoader);
60
+ return jsonLoader.readSkeletonData(textSkeletonData);
61
+ }
62
+ return undefined;
63
+ }
64
+ #getCachedSkeletonData() {
65
+ try {
66
+ if (!this.#rawSkeletonData && !this.#skel && !this.#json)
67
+ return undefined;
68
+ if (!textLoader.checkCached(this.#atlas))
69
+ return undefined;
70
+ const atlasText = textLoader.getCached(this.#atlas);
71
+ let texture;
72
+ let textures;
73
+ if (typeof this.#texture === 'string') {
74
+ if (!textureLoader.checkCached(this.#texture))
75
+ return undefined;
76
+ texture = textureLoader.getCached(this.#texture);
77
+ }
78
+ else if (this.#texture) {
79
+ textures = {};
80
+ for (const [key, path] of Object.entries(this.#texture)) {
81
+ if (!textureLoader.checkCached(path))
82
+ return undefined;
83
+ textures[key] = textureLoader.getCached(path);
84
+ }
85
+ }
86
+ else {
87
+ return undefined;
88
+ }
89
+ let skeletonBinary;
90
+ let textSkeletonData;
91
+ if (!this.#rawSkeletonData) {
92
+ if (this.#skel) {
93
+ if (!binaryLoader.checkCached(this.#skel))
94
+ return undefined;
95
+ skeletonBinary = binaryLoader.getCached(this.#skel);
96
+ }
97
+ else if (this.#json) {
98
+ if (!textLoader.checkCached(this.#json))
99
+ return undefined;
100
+ textSkeletonData = textLoader.getCached(this.#json);
101
+ }
102
+ }
103
+ return this.#buildSkeletonData(atlasText, texture, textures, skeletonBinary, textSkeletonData);
104
+ }
105
+ catch (e) {
106
+ console.error('Failed to build skeleton data from cache:', e);
107
+ return undefined;
108
+ }
109
+ }
110
+ async #loadSkeletonData() {
111
+ if (!this.#rawSkeletonData && !this.#skel && !this.#json)
112
+ return undefined;
113
+ const promises = [];
114
+ let atlasText;
115
+ let skeletonBinary;
116
+ let textSkeletonData;
117
+ let texture;
118
+ let textures;
119
+ // Load atlas (text)
120
+ if (!textLoader.checkCached(this.#atlas))
121
+ console.info(`Atlas not preloaded. Loading now: ${this.#atlas}`);
122
+ promises.push((async () => (atlasText = await textLoader.load(this.#atlas)))());
123
+ // Load skeleton (raw / binary / json)
124
+ if (this.#rawSkeletonData) {
125
+ // already provided
126
+ }
127
+ else if (this.#skel) {
128
+ if (!binaryLoader.checkCached(this.#skel))
129
+ console.info(`Skeleton not preloaded. Loading now: ${this.#skel}`);
130
+ promises.push((async () => (skeletonBinary = await binaryLoader.load(this.#skel)))());
131
+ }
132
+ else if (this.#json) {
133
+ if (!textLoader.checkCached(this.#json))
134
+ console.info(`Skeleton not preloaded. Loading now: ${this.#json}`);
135
+ promises.push((async () => (textSkeletonData = await textLoader.load(this.#json)))());
136
+ }
137
+ else {
138
+ console.error('Either skel or json must be provided');
139
+ return undefined;
140
+ }
141
+ // Load textures (single or multiple)
142
+ if (typeof this.#texture === 'string') {
143
+ if (!textureLoader.checkCached(this.#texture))
144
+ console.info(`Texture not preloaded. Loading now: ${this.#texture}`);
145
+ promises.push((async () => (texture = await textureLoader.load(this.#texture)))());
146
+ }
147
+ else if (this.#texture) {
148
+ textures = {};
149
+ for (const [key, path] of Object.entries(this.#texture)) {
150
+ if (!textureLoader.checkCached(path))
151
+ console.info(`Texture not preloaded. Loading now: ${path}`);
152
+ promises.push((async () => {
153
+ const t = await textureLoader.load(path);
154
+ if (t)
155
+ textures[key] = t;
156
+ })());
157
+ }
158
+ }
159
+ await Promise.all(promises);
160
+ if (!atlasText)
161
+ return undefined;
162
+ if (!texture && !(textures && Object.keys(textures).length))
163
+ return undefined;
164
+ return this.#buildSkeletonData(atlasText, texture, textures, skeletonBinary, textSkeletonData);
165
+ }
166
+ async #load() {
167
+ let skeletonData = this.#getCachedSkeletonData();
168
+ if (!skeletonData) {
169
+ skeletonData = await this.#loadSkeletonData();
170
+ }
171
+ this.#spine?.destroy();
172
+ this.#spine = undefined;
173
+ if (skeletonData) {
174
+ const s = new PixiSpine(skeletonData);
175
+ s.state.addListener({
176
+ complete: (e) => this.emit('animationend', e.animation?.name ?? '')
177
+ });
178
+ this.#spine = s;
179
+ this.#updateAnimation();
180
+ this.#updateSkins();
181
+ this._pixiContainer.addChild(s);
182
+ }
183
+ }
184
+ #updateSkins() {
185
+ const s = this.#spine?.skeleton;
186
+ if (s && this.#skins) {
187
+ const newSkin = new Skin('combined-skin');
188
+ for (const skinName of this.#skins) {
189
+ const skin = s.data.findSkin(skinName);
190
+ if (skin)
191
+ newSkin.addSkin(skin);
192
+ }
193
+ s.setSkin(newSkin);
194
+ s.setSlotsToSetupPose();
195
+ }
196
+ }
197
+ #updateAnimation() {
198
+ const s = this.#spine;
199
+ if (s && this.#animation) {
200
+ s.state.setAnimation(0, this.#animation, this.#loop ?? true);
201
+ s.state.apply(s.skeleton);
202
+ }
203
+ }
204
+ set atlas(atlas) {
205
+ if (this.#atlas !== atlas) {
206
+ this.#atlas = atlas;
207
+ this.#load();
208
+ }
209
+ }
210
+ get atlas() { return this.#atlas; }
211
+ set texture(texture) {
212
+ if (this.#texture !== texture) {
213
+ this.#texture = texture;
214
+ this.#load();
215
+ }
216
+ }
217
+ get texture() { return this.#texture; }
218
+ set rawSkeletonData(rawSkeletonData) {
219
+ if (this.#rawSkeletonData !== rawSkeletonData) {
220
+ this.#rawSkeletonData = rawSkeletonData;
221
+ this.#load();
222
+ }
223
+ }
224
+ get rawSkeletonData() { return this.#rawSkeletonData; }
225
+ set skel(skel) {
226
+ if (this.#skel !== skel) {
227
+ this.#skel = skel;
228
+ this.#load();
229
+ }
230
+ }
231
+ get skel() { return this.#skel; }
232
+ set json(json) {
233
+ if (this.#json !== json) {
234
+ this.#json = json;
235
+ this.#load();
236
+ }
237
+ }
238
+ get json() { return this.#json; }
239
+ set skins(skins) {
240
+ if (this.#skins !== skins) {
241
+ this.#skins = skins;
242
+ this.#updateSkins();
243
+ }
244
+ }
245
+ get skins() { return this.#skins; }
246
+ set animation(animation) {
247
+ if (this.#animation !== animation) {
248
+ this.#animation = animation;
249
+ this.#updateAnimation();
250
+ }
251
+ }
252
+ get animation() { return this.#animation; }
253
+ set loop(loop) {
254
+ if (this.#loop !== loop) {
255
+ this.#loop = loop;
256
+ this.#updateAnimation();
257
+ }
258
+ }
259
+ get loop() { return this.#loop; }
260
+ remove() {
261
+ if (typeof this.#texture === 'string') {
262
+ textureLoader.release(this.#texture);
263
+ }
264
+ else if (this.#texture) {
265
+ for (const path of Object.values(this.#texture)) {
266
+ textureLoader.release(path);
267
+ }
268
+ }
269
+ super.remove();
270
+ }
271
+ }
272
+ //# sourceMappingURL=spine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spine.js","sourceRoot":"","sources":["../../../src/node/ext/spine.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtlasAttachmentLoader, Spine as PixiSpine, SkeletonBinary, SkeletonJson, Skin, SpineTexture, TextureAtlas } from '@esotericsoftware/spine-pixi-v8'\nimport { EventMap } from '@webtaku/event-emitter'\nimport { Texture } from 'pixi.js'\nimport { binaryLoader } from '../../asset/loaders/binary'\nimport { textLoader } from '../../asset/loaders/text'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpineNodeOptions = {\n atlas: string\n texture: string | Record<string, string>\n\n rawSkeletonData?: any\n skel?: string\n json?: string\n\n skins?: string[]\n animation?: string\n loop?: boolean\n} & GameObjectOptions\n\nexport class SpineNode<E extends EventMap = EventMap> extends GameObject<E & {\n animationend: (animation: string) => void\n}> {\n #atlas: string\n #texture: string | Record<string, string>\n\n #rawSkeletonData?: any\n #skel?: string\n #json?: string\n\n #skins?: string[]\n #animation?: string\n #loop?: boolean\n\n #spine?: PixiSpine\n\n constructor(options: SpineNodeOptions) {\n super(options)\n this.#atlas = options.atlas\n this.#texture = options.texture\n this.#rawSkeletonData = options.rawSkeletonData\n this.#skel = options.skel\n this.#json = options.json\n this.#skins = options.skins\n this.#animation = options.animation\n this.#loop = options.loop\n this.#load()\n }\n\n #buildSkeletonData(\n atlasText: string,\n texture: Texture | undefined,\n textures: Record<string, Texture> | undefined,\n skeletonBinary: Uint8Array | undefined,\n textSkeletonData: string | undefined\n ) {\n if (!atlasText) return undefined\n if (!texture && !textures) return undefined\n if (!this.rawSkeletonData && !skeletonBinary && !textSkeletonData) return undefined\n\n // Create TextureAtlas and bind pages to provided textures\n const atlas = new TextureAtlas(atlasText)\n atlas.pages.forEach((page) => {\n if (texture) {\n page.setTexture(SpineTexture.from(texture.source))\n } else if (textures) {\n const t = textures[page.name]\n if (!t) throw new Error(`Missing texture for atlas page: ${page.name}`)\n page.setTexture(SpineTexture.from(t.source))\n }\n })\n\n const atlasLoader = new AtlasAttachmentLoader(atlas)\n\n // Parse skeleton data depending on available source\n if (this.rawSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(this.rawSkeletonData)\n }\n if (skeletonBinary) {\n const binLoader = new SkeletonBinary(atlasLoader)\n return binLoader.readSkeletonData(skeletonBinary)\n }\n if (textSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(textSkeletonData)\n }\n return undefined\n }\n\n #getCachedSkeletonData() {\n try {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n if (!textLoader.checkCached(this.#atlas)) return undefined\n\n const atlasText = textLoader.getCached(this.#atlas)!\n\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) return undefined\n texture = textureLoader.getCached(this.#texture)!\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) return undefined\n textures[key] = textureLoader.getCached(path)!\n }\n } else {\n return undefined\n }\n\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n\n if (!this.#rawSkeletonData) {\n if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) return undefined\n skeletonBinary = binaryLoader.getCached(this.#skel)!\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) return undefined\n textSkeletonData = textLoader.getCached(this.#json)!\n }\n }\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n } catch (e) {\n console.error('Failed to build skeleton data from cache:', e)\n return undefined\n }\n }\n\n async #loadSkeletonData() {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n\n const promises: Promise<any>[] = []\n\n let atlasText: string | undefined\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n // Load atlas (text)\n if (!textLoader.checkCached(this.#atlas)) console.info(`Atlas not preloaded. Loading now: ${this.#atlas}`)\n promises.push((async () => (atlasText = await textLoader.load(this.#atlas)))())\n\n // Load skeleton (raw / binary / json)\n if (this.#rawSkeletonData) {\n // already provided\n } else if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) console.info(`Skeleton not preloaded. Loading now: ${this.#skel}`)\n promises.push((async () => (skeletonBinary = await binaryLoader.load(this.#skel!)))())\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) console.info(`Skeleton not preloaded. Loading now: ${this.#json}`)\n promises.push((async () => (textSkeletonData = await textLoader.load(this.#json!)))())\n } else {\n console.error('Either skel or json must be provided')\n return undefined\n }\n\n // Load textures (single or multiple)\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) console.info(`Texture not preloaded. Loading now: ${this.#texture}`)\n promises.push((async () => (texture = await textureLoader.load(this.#texture as string)))())\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) console.info(`Texture not preloaded. Loading now: ${path}`)\n promises.push((async () => {\n const t = await textureLoader.load(path)\n if (t) textures![key] = t\n })())\n }\n }\n\n await Promise.all(promises)\n\n if (!atlasText) return undefined\n if (!texture && !(textures && Object.keys(textures).length)) return undefined\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n }\n\n async #load() {\n let skeletonData = this.#getCachedSkeletonData()\n if (!skeletonData) {\n skeletonData = await this.#loadSkeletonData()\n }\n\n this.#spine?.destroy()\n this.#spine = undefined\n\n if (skeletonData) {\n const s = new PixiSpine(skeletonData)\n s.state.addListener({\n complete: (e) => (this as any).emit('animationend', e.animation?.name ?? '')\n })\n this.#spine = s\n this.#updateAnimation()\n this.#updateSkins()\n this._pixiContainer.addChild(s)\n }\n }\n\n #updateSkins() {\n const s = this.#spine?.skeleton\n if (s && this.#skins) {\n const newSkin = new Skin('combined-skin')\n for (const skinName of this.#skins) {\n const skin = s.data.findSkin(skinName)\n if (skin) newSkin.addSkin(skin)\n }\n s.setSkin(newSkin)\n s.setSlotsToSetupPose()\n }\n }\n\n #updateAnimation() {\n const s = this.#spine\n if (s && this.#animation) {\n s.state.setAnimation(0, this.#animation, this.#loop ?? true)\n s.state.apply(s.skeleton)\n }\n }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set texture(texture) {\n if (this.#texture !== texture) {\n this.#texture = texture\n this.#load()\n }\n }\n\n get texture() { return this.#texture }\n\n set rawSkeletonData(rawSkeletonData) {\n if (this.#rawSkeletonData !== rawSkeletonData) {\n this.#rawSkeletonData = rawSkeletonData\n this.#load()\n }\n }\n\n get rawSkeletonData() { return this.#rawSkeletonData }\n\n set skel(skel) {\n if (this.#skel !== skel) {\n this.#skel = skel\n this.#load()\n }\n }\n\n get skel() { return this.#skel }\n\n set json(json) {\n if (this.#json !== json) {\n this.#json = json\n this.#load()\n }\n }\n\n get json() { return this.#json }\n\n set skins(skins) {\n if (this.#skins !== skins) {\n this.#skins = skins\n this.#updateSkins()\n }\n }\n\n get skins() { return this.#skins }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#updateAnimation()\n }\n }\n\n get animation() { return this.#animation }\n\n set loop(loop) {\n if (this.#loop !== loop) {\n this.#loop = loop\n this.#updateAnimation()\n }\n }\n\n get loop() { return this.#loop }\n\n remove() {\n if (typeof this.#texture === 'string') {\n textureLoader.release(this.#texture)\n } else if (this.#texture) {\n for (const path of Object.values(this.#texture)) {\n textureLoader.release(path)\n }\n }\n super.remove()\n }\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { Sprite as PixiSprite } from 'pixi.js';
2
+ import { textureLoader } from '../../asset/loaders/texture';
3
+ import { GameObject } from '../core/game-object';
4
+ export class SpriteNode extends GameObject {
5
+ #src;
6
+ #sprite;
7
+ constructor(options) {
8
+ super(options);
9
+ this.#src = options.src;
10
+ this.#load();
11
+ }
12
+ async #load() {
13
+ let texture;
14
+ if (textureLoader.checkCached(this.#src)) {
15
+ texture = textureLoader.getCached(this.#src);
16
+ }
17
+ else {
18
+ console.info(`Texture not preloaded. Loading now: ${this.#src}`);
19
+ texture = await textureLoader.load(this.#src);
20
+ }
21
+ this.#sprite?.destroy();
22
+ this.#sprite = undefined;
23
+ if (texture) {
24
+ const s = new PixiSprite({ texture, anchor: 0.5, zIndex: -999999 });
25
+ this._pixiContainer.addChild(s);
26
+ this.#sprite = s;
27
+ }
28
+ }
29
+ set src(src) {
30
+ if (this.#src !== src) {
31
+ textureLoader.release(this.#src);
32
+ this.#src = src;
33
+ this.#load();
34
+ }
35
+ }
36
+ get src() { return this.#src; }
37
+ remove() {
38
+ textureLoader.release(this.#src);
39
+ super.remove();
40
+ }
41
+ }
42
+ //# sourceMappingURL=sprite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../../../src/node/ext/sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAA;AAMnE,MAAM,OAAO,UAA0C,SAAQ,UAAa;IAC1E,IAAI,CAAQ;IACZ,OAAO,CAAa;IAEpB,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YACnE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Sprite as PixiSprite } from 'pixi.js'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpriteNodeOptions = {\n src: string\n} & GameObjectOptions\n\nexport class SpriteNode<E extends EventMap = EventMap> extends GameObject<E> {\n #src: string\n #sprite?: PixiSprite\n\n constructor(options: SpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (textureLoader.checkCached(this.#src)) {\n texture = textureLoader.getCached(this.#src)\n } else {\n console.info(`Texture not preloaded. Loading now: ${this.#src}`)\n texture = await textureLoader.load(this.#src)\n }\n\n this.#sprite?.destroy()\n this.#sprite = undefined\n\n if (texture) {\n const s = new PixiSprite({ texture, anchor: 0.5, zIndex: -999999 })\n this._pixiContainer.addChild(s)\n this.#sprite = s\n }\n }\n\n set src(src) {\n if (this.#src !== src) {\n textureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n textureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
@@ -0,0 +1,112 @@
1
+ import Matter from 'matter-js';
2
+ import { Container as PixiContainer } from 'pixi.js';
3
+ import { ColliderType } from '../../collision/colliders';
4
+ import { isRenderableNode, RenderableNode } from '../core/renderable';
5
+ import { LocalTransform } from '../core/transform';
6
+ import { PhysicsWorld } from './physics-world';
7
+ function createEllipseBody(x, y, width, height, options = {},
8
+ // segLen은 "인접 정점 사이의 목표 간격(px)" 정도로 생각하면 됩니다.
9
+ segLen = 6) {
10
+ const rx = width / 2;
11
+ const ry = height / 2;
12
+ // 주변길이 ~ π(a+b) 근사 → 그 길이를 segLen 간격으로 쪼개서 정점 수 결정
13
+ const perimeterApprox = Math.PI * (rx + ry);
14
+ const segments = Math.max(12, Math.ceil(perimeterApprox / segLen));
15
+ const verts = Array.from({ length: segments }, (_, i) => {
16
+ const t = (i / segments) * Math.PI * 2;
17
+ return { x: Math.cos(t) * rx, y: Math.sin(t) * ry };
18
+ });
19
+ // fromVertices는 로컬 기준이므로 x,y는 중심 위치로 넘깁니다.
20
+ return Matter.Bodies.fromVertices(x, y, [verts], options);
21
+ }
22
+ export class PhysicsObject extends RenderableNode {
23
+ #localTransform = new LocalTransform();
24
+ #matterBody;
25
+ #useYSort = false;
26
+ constructor(options) {
27
+ super(new PixiContainer({ sortableChildren: true }));
28
+ const c = options.collider;
29
+ const x = options.x ?? 0;
30
+ const y = options.y ?? 0;
31
+ const bodyOptions = {
32
+ angle: options.rotation ?? 0,
33
+ velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },
34
+ isStatic: options.isStatic ?? false
35
+ };
36
+ if (options.fixedRotation) {
37
+ bodyOptions.inertia = Infinity;
38
+ bodyOptions.angularVelocity = 0;
39
+ }
40
+ if (c.type === ColliderType.Rectangle) {
41
+ this.#matterBody = Matter.Bodies.rectangle(x, y, c.width, c.height, bodyOptions);
42
+ }
43
+ else if (c.type === ColliderType.Circle) {
44
+ this.#matterBody = Matter.Bodies.circle(x, y, c.radius, bodyOptions);
45
+ }
46
+ else if (c.type === ColliderType.Ellipse) {
47
+ this.#matterBody = createEllipseBody(x, y, c.width, c.height, bodyOptions,
48
+ /* segLen= */ 6 // 더 매끄럽게 하고 싶으면 더 작게
49
+ );
50
+ }
51
+ else if (c.type === ColliderType.Polygon) {
52
+ this.#matterBody = Matter.Bodies.fromVertices(x, y, [c.vertices], bodyOptions);
53
+ }
54
+ else {
55
+ throw new Error('Invalid collider type');
56
+ }
57
+ this.#useYSort = options.useYSort ?? false;
58
+ }
59
+ set parent(parent) {
60
+ if (!(parent instanceof PhysicsWorld)) {
61
+ const actual = parent === undefined
62
+ ? 'undefined'
63
+ : parent.constructor?.name ?? typeof parent;
64
+ throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`);
65
+ }
66
+ parent.addBody(this.#matterBody);
67
+ super.parent = parent;
68
+ }
69
+ get parent() {
70
+ return super.parent;
71
+ }
72
+ _updateWorldTransform() {
73
+ const mb = this.#matterBody;
74
+ const pc = this._pixiContainer;
75
+ pc.position.set(mb.position.x, mb.position.y);
76
+ if (this.#useYSort)
77
+ pc.zIndex = mb.position.y;
78
+ pc.rotation = mb.angle;
79
+ const lt = this.#localTransform;
80
+ lt.x = mb.position.x;
81
+ lt.y = mb.position.y;
82
+ lt.rotation = mb.angle;
83
+ const parent = this.parent;
84
+ if (parent && isRenderableNode(parent)) {
85
+ this.worldTransform.update(parent.worldTransform, this.#localTransform);
86
+ }
87
+ super._updateWorldTransform();
88
+ }
89
+ #removeFromWorld() {
90
+ this.parent?.removeBody(this.#matterBody);
91
+ }
92
+ remove() {
93
+ this.#removeFromWorld();
94
+ super.remove();
95
+ }
96
+ set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }); }
97
+ get x() { return this.#matterBody.position.x; }
98
+ set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }); }
99
+ get y() { return this.#matterBody.position.y; }
100
+ set rotation(v) { Matter.Body.setAngle(this.#matterBody, v); }
101
+ get rotation() { return this.#matterBody.angle; }
102
+ set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }); }
103
+ get velocityX() { return this.#matterBody.velocity.x; }
104
+ set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }); }
105
+ get velocityY() { return this.#matterBody.velocity.y; }
106
+ set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v); }
107
+ get isStatic() { return this.#matterBody.isStatic; }
108
+ disableCollisions() {
109
+ this.#removeFromWorld();
110
+ }
111
+ }
112
+ //# sourceMappingURL=physics-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-object.js","sourceRoot":"","sources":["../../../src/node/physics/physics-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport Matter, { IChamferableBodyDefinition } from 'matter-js'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { Collider, ColliderType } from '../../collision/colliders'\nimport { GameNode } from '../core/game-node'\nimport { isRenderableNode, RenderableNode } from '../core/renderable'\nimport { LocalTransform } from '../core/transform'\nimport { PhysicsWorld } from './physics-world'\n\nfunction createEllipseBody(\n x: number,\n y: number,\n width: number,\n height: number,\n options: IChamferableBodyDefinition = {},\n // segLen은 \"인접 정점 사이의 목표 간격(px)\" 정도로 생각하면 됩니다.\n segLen = 6\n): Matter.Body {\n const rx = width / 2\n const ry = height / 2\n\n // 주변길이 ~ π(a+b) 근사 → 그 길이를 segLen 간격으로 쪼개서 정점 수 결정\n const perimeterApprox = Math.PI * (rx + ry)\n const segments = Math.max(12, Math.ceil(perimeterApprox / segLen))\n\n const verts = Array.from({ length: segments }, (_, i) => {\n const t = (i / segments) * Math.PI * 2\n return { x: Math.cos(t) * rx, y: Math.sin(t) * ry }\n })\n\n // fromVertices는 로컬 기준이므로 x,y는 중심 위치로 넘깁니다.\n return Matter.Bodies.fromVertices(x, y, [verts], options)\n}\n\nexport type PhysicsObjectOptions = {\n collider: Collider\n x?: number\n y?: number\n rotation?: number\n fixedRotation?: boolean\n velocityX?: number\n velocityY?: number\n isStatic?: boolean\n\n useYSort?: boolean\n}\n\nexport class PhysicsObject<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {\n #localTransform = new LocalTransform()\n #matterBody: Matter.Body\n\n #useYSort = false\n\n constructor(options: PhysicsObjectOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n\n const c = options.collider\n const x = options.x ?? 0\n const y = options.y ?? 0\n\n const bodyOptions: IChamferableBodyDefinition = {\n angle: options.rotation ?? 0,\n velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },\n isStatic: options.isStatic ?? false\n }\n\n if (options.fixedRotation) {\n bodyOptions.inertia = Infinity\n bodyOptions.angularVelocity = 0\n }\n\n if (c.type === ColliderType.Rectangle) {\n this.#matterBody = Matter.Bodies.rectangle(x, y, c.width, c.height, bodyOptions)\n } else if (c.type === ColliderType.Circle) {\n this.#matterBody = Matter.Bodies.circle(x, y, c.radius, bodyOptions)\n } else if (c.type === ColliderType.Ellipse) {\n this.#matterBody = createEllipseBody(\n x, y, c.width, c.height, bodyOptions,\n /* segLen= */ 6 // 더 매끄럽게 하고 싶으면 더 작게\n )\n } else if (c.type === ColliderType.Polygon) {\n this.#matterBody = Matter.Bodies.fromVertices(x, y, [c.vertices], bodyOptions)\n } else {\n throw new Error('Invalid collider type')\n }\n\n this.#useYSort = options.useYSort ?? false\n }\n\n protected override set parent(parent: GameNode<EventMap> | undefined) {\n if (!(parent instanceof PhysicsWorld)) {\n const actual = parent === undefined\n ? 'undefined'\n : parent.constructor?.name ?? typeof parent\n throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`)\n }\n parent.addBody(this.#matterBody)\n super.parent = parent\n }\n\n protected override get parent() {\n return super.parent\n }\n\n override _updateWorldTransform() {\n const mb = this.#matterBody\n\n const pc = this._pixiContainer\n pc.position.set(mb.position.x, mb.position.y)\n if (this.#useYSort) pc.zIndex = mb.position.y\n pc.rotation = mb.angle\n\n const lt = this.#localTransform\n lt.x = mb.position.x\n lt.y = mb.position.y\n lt.rotation = mb.angle\n\n const parent = this.parent\n if (parent && isRenderableNode(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n }\n\n super._updateWorldTransform()\n }\n\n #removeFromWorld() {\n (this.parent as PhysicsWorld)?.removeBody(this.#matterBody)\n }\n\n override remove() {\n this.#removeFromWorld()\n super.remove()\n }\n\n set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }) }\n get x() { return this.#matterBody.position.x }\n\n set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }) }\n get y() { return this.#matterBody.position.y }\n\n set rotation(v) { Matter.Body.setAngle(this.#matterBody, v) }\n get rotation() { return this.#matterBody.angle }\n\n set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }) }\n get velocityX() { return this.#matterBody.velocity.x }\n\n set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }) }\n get velocityY() { return this.#matterBody.velocity.y }\n\n set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v) }\n get isStatic() { return this.#matterBody.isStatic }\n\n disableCollisions() {\n this.#removeFromWorld()\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import Matter from 'matter-js';
2
+ import { Container as PixiContainer } from 'pixi.js';
3
+ import { RenderableNode } from '../core/renderable';
4
+ export class PhysicsWorld extends RenderableNode {
5
+ #matterEngine = Matter.Engine.create();
6
+ constructor(options) {
7
+ super(new PixiContainer({ sortableChildren: true }));
8
+ this.worldTransform.x.v = 0;
9
+ this.worldTransform.y.v = 0;
10
+ this.worldTransform.resetDirty();
11
+ this.gravity = options?.gravity ?? 0;
12
+ }
13
+ set gravity(v) { this.#matterEngine.gravity.y = v; }
14
+ get gravity() { return this.#matterEngine.gravity.y; }
15
+ addBody(body) { Matter.World.add(this.#matterEngine.world, body); }
16
+ removeBody(body) { Matter.World.remove(this.#matterEngine.world, body); }
17
+ update(dt) {
18
+ super.update(dt);
19
+ const matterDt = dt * 1000;
20
+ Matter.Engine.update(this.#matterEngine, matterDt > 16.666 ? 16.666 : matterDt);
21
+ }
22
+ remove() {
23
+ Matter.Engine.clear(this.#matterEngine);
24
+ super.remove();
25
+ }
26
+ }
27
+ //# sourceMappingURL=physics-world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-world.js","sourceRoot":"","sources":["../../../src/node/physics/physics-world.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAMnD,MAAM,OAAO,YAA4C,SAAQ,cAAgC;IAC/F,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IAEtC,YAAY,OAA6B;QACvC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAEpD,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAEhC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA,CAAC,CAAC;IAErD,OAAO,CAAC,IAAiB,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IAC/E,UAAU,CAAC,IAAiB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IAElE,MAAM,CAAC,EAAU;QAClC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAEhB,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACjF,CAAC;IAEQ,MAAM;QACb,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACvC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport Matter from 'matter-js'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { RenderableNode } from '../core/renderable'\n\nexport type PhysicsWorldOptions = {\n gravity?: number\n}\n\nexport class PhysicsWorld<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {\n #matterEngine = Matter.Engine.create()\n\n constructor(options?: PhysicsWorldOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n\n this.gravity = options?.gravity ?? 0\n }\n\n set gravity(v) { this.#matterEngine.gravity.y = v }\n get gravity() { return this.#matterEngine.gravity.y }\n\n addBody(body: Matter.Body) { Matter.World.add(this.#matterEngine.world, body) }\n removeBody(body: Matter.Body) { Matter.World.remove(this.#matterEngine.world, body) }\n\n protected override update(dt: number) {\n super.update(dt)\n\n const matterDt = dt * 1000\n Matter.Engine.update(this.#matterEngine, matterDt > 16.666 ? 16.666 : matterDt)\n }\n\n override remove() {\n Matter.Engine.clear(this.#matterEngine)\n super.remove()\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter';
2
+ export class Camera extends EventEmitter {
3
+ #x = 0;
4
+ #y = 0;
5
+ #scale = 1;
6
+ get x() { return this.#x; }
7
+ get y() { return this.#y; }
8
+ get scale() { return this.#scale; }
9
+ setPosition(x, y) {
10
+ this.#x = x;
11
+ this.#y = y;
12
+ this.emit('positionChanged');
13
+ }
14
+ setScale(scale) {
15
+ this.#scale = scale;
16
+ this.emit('scaleChanged');
17
+ }
18
+ }
19
+ //# sourceMappingURL=camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../src/renderer/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,MAAM,OAAO,MAAO,SAAQ,YAG1B;IACA,EAAE,GAAG,CAAC,CAAA;IACN,EAAE,GAAG,CAAC,CAAA;IACN,MAAM,GAAG,CAAC,CAAA;IAEV,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,EAAE,CAAA,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,EAAE,CAAA,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAA,CAAC,CAAC;IAElC,WAAW,CAAC,CAAS,EAAE,CAAS;QAC9B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QACX,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC9B,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC3B,CAAC;CACF","sourcesContent":["import { EventEmitter } from '@webtaku/event-emitter'\n\nexport class Camera extends EventEmitter<{\n positionChanged: () => void\n scaleChanged: () => void\n}> {\n #x = 0\n #y = 0\n #scale = 1\n\n get x() { return this.#x }\n get y() { return this.#y }\n get scale() { return this.#scale }\n\n setPosition(x: number, y: number) {\n this.#x = x\n this.#y = y\n this.emit('positionChanged')\n }\n\n setScale(scale: number) {\n this.#scale = scale\n this.emit('scaleChanged')\n }\n}"]}
@@ -0,0 +1,29 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter';
2
+ import { DirtyNumber } from '../node/core/dirty-number';
3
+ export class RendererContainerManager extends EventEmitter {
4
+ #container;
5
+ #containerResizeObserver;
6
+ #containerWidth = new DirtyNumber(0);
7
+ #containerHeight = new DirtyNumber(0);
8
+ constructor(container) {
9
+ super();
10
+ this.#container = container;
11
+ this.#containerResizeObserver = new ResizeObserver(this.#resizeListener.bind(this));
12
+ this.#containerResizeObserver.observe(container);
13
+ }
14
+ #resizeListener() {
15
+ const cr = this.#container.getBoundingClientRect();
16
+ this.#containerWidth.v = cr.width;
17
+ this.#containerHeight.v = cr.height;
18
+ if (this.#containerWidth.dirty || this.#containerHeight.dirty) {
19
+ this.emit('resize', this.#containerWidth.v, this.#containerHeight.v);
20
+ this.#containerWidth.resetDirty();
21
+ this.#containerHeight.resetDirty();
22
+ }
23
+ }
24
+ remove() {
25
+ this.#containerResizeObserver.disconnect();
26
+ super.remove();
27
+ }
28
+ }
29
+ //# sourceMappingURL=container-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../src/renderer/container-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,OAAO,wBAAyB,SAAQ,YAE5C;IACA,UAAU,CAAa;IACvB,wBAAwB,CAAgB;IACxC,eAAe,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IACpC,gBAAgB,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IAErC,YAAY,SAAsB;QAChC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,wBAAwB,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnF,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAClD,CAAC;IAED,eAAe;QACb,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAA;QAClD,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAA;QACjC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAA;QAEnC,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YAEpE,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAA;YACjC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAA;QACpC,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAA;QAC1C,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventEmitter } from '@webtaku/event-emitter'\nimport { DirtyNumber } from '../node/core/dirty-number'\n\nexport class RendererContainerManager extends EventEmitter<{\n resize: (width: number, height: number) => void\n}> {\n #container: HTMLElement\n #containerResizeObserver: ResizeObserver\n #containerWidth = new DirtyNumber(0)\n #containerHeight = new DirtyNumber(0)\n\n constructor(container: HTMLElement) {\n super()\n this.#container = container\n this.#containerResizeObserver = new ResizeObserver(this.#resizeListener.bind(this))\n this.#containerResizeObserver.observe(container)\n }\n\n #resizeListener() {\n const cr = this.#container.getBoundingClientRect()\n this.#containerWidth.v = cr.width\n this.#containerHeight.v = cr.height\n\n if (this.#containerWidth.dirty || this.#containerHeight.dirty) {\n this.emit('resize', this.#containerWidth.v, this.#containerHeight.v)\n\n this.#containerWidth.resetDirty()\n this.#containerHeight.resetDirty()\n }\n }\n\n override remove() {\n this.#containerResizeObserver.disconnect()\n super.remove()\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import Stats from 'stats.js';
2
+ export class FpsDisplay {
3
+ #stats;
4
+ constructor(container) {
5
+ const stats = new Stats();
6
+ stats.dom.style.position = 'absolute';
7
+ stats.showPanel(0);
8
+ container.appendChild(stats.dom);
9
+ this.#stats = stats;
10
+ }
11
+ update() {
12
+ this.#stats.update();
13
+ }
14
+ remove() {
15
+ this.#stats.dom.remove();
16
+ }
17
+ }
18
+ //# sourceMappingURL=fps-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fps-display.js","sourceRoot":"","sources":["../../src/renderer/fps-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,UAAU,CAAA;AAE5B,MAAM,OAAO,UAAU;IACrB,MAAM,CAAO;IAEb,YAAY,SAAsB;QAChC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;QACzB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAA;QACrC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAClB,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACrB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAA;IAC1B,CAAC;CACF","sourcesContent":["import Stats from 'stats.js'\n\nexport class FpsDisplay {\n #stats: Stats\n\n constructor(container: HTMLElement) {\n const stats = new Stats()\n stats.dom.style.position = 'absolute'\n stats.showPanel(0)\n container.appendChild(stats.dom)\n this.#stats = stats\n }\n\n update() {\n this.#stats.update()\n }\n\n remove() {\n this.#stats.dom.remove()\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { Container as PixiContainer } from 'pixi.js';
2
+ import { RenderableNode } from '../node/core/renderable';
3
+ export class Layer extends RenderableNode {
4
+ constructor(drawOrder) {
5
+ super(new PixiContainer({ sortableChildren: true }));
6
+ this._pixiContainer.zIndex = drawOrder;
7
+ this.worldTransform.x.v = 0;
8
+ this.worldTransform.y.v = 0;
9
+ this.worldTransform.resetDirty();
10
+ }
11
+ }
12
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.js","sourceRoot":"","sources":["../../src/renderer/layer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,OAAO,KAAM,SAAQ,cAAuC;IAChE,YAAY,SAAiB;QAC3B,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAEpD,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAA;QAEtC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;IAClC,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { RenderableNode } from '../node/core/renderable'\n\nexport class Layer extends RenderableNode<PixiContainer, EventMap> {\n constructor(drawOrder: number) {\n super(new PixiContainer({ sortableChildren: true }))\n\n this._pixiContainer.zIndex = drawOrder\n\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n }\n}\n"]}