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,323 @@
1
+ import { AtlasAttachmentLoader, Spine as PixiSpine, SkeletonBinary, SkeletonJson, Skin, SpineTexture, TextureAtlas } from '@esotericsoftware/spine-pixi-v8'
2
+ import { EventMap } from '@webtaku/event-emitter'
3
+ import { Texture } from 'pixi.js'
4
+ import { binaryLoader } from '../../asset/loaders/binary'
5
+ import { textLoader } from '../../asset/loaders/text'
6
+ import { textureLoader } from '../../asset/loaders/texture'
7
+ import { GameObject, GameObjectOptions } from '../core/game-object'
8
+
9
+ export type SpineNodeOptions = {
10
+ atlas: string
11
+ texture: string | Record<string, string>
12
+
13
+ rawSkeletonData?: any
14
+ skel?: string
15
+ json?: string
16
+
17
+ skins?: string[]
18
+ animation?: string
19
+ loop?: boolean
20
+ } & GameObjectOptions
21
+
22
+ export class SpineNode<E extends EventMap = EventMap> extends GameObject<E & {
23
+ animationend: (animation: string) => void
24
+ }> {
25
+ #atlas: string
26
+ #texture: string | Record<string, string>
27
+
28
+ #rawSkeletonData?: any
29
+ #skel?: string
30
+ #json?: string
31
+
32
+ #skins?: string[]
33
+ #animation?: string
34
+ #loop?: boolean
35
+
36
+ #spine?: PixiSpine
37
+
38
+ constructor(options: SpineNodeOptions) {
39
+ super(options)
40
+ this.#atlas = options.atlas
41
+ this.#texture = options.texture
42
+ this.#rawSkeletonData = options.rawSkeletonData
43
+ this.#skel = options.skel
44
+ this.#json = options.json
45
+ this.#skins = options.skins
46
+ this.#animation = options.animation
47
+ this.#loop = options.loop
48
+ this.#load()
49
+ }
50
+
51
+ #buildSkeletonData(
52
+ atlasText: string,
53
+ texture: Texture | undefined,
54
+ textures: Record<string, Texture> | undefined,
55
+ skeletonBinary: Uint8Array | undefined,
56
+ textSkeletonData: string | undefined
57
+ ) {
58
+ if (!atlasText) return undefined
59
+ if (!texture && !textures) return undefined
60
+ if (!this.rawSkeletonData && !skeletonBinary && !textSkeletonData) return undefined
61
+
62
+ // Create TextureAtlas and bind pages to provided textures
63
+ const atlas = new TextureAtlas(atlasText)
64
+ atlas.pages.forEach((page) => {
65
+ if (texture) {
66
+ page.setTexture(SpineTexture.from(texture.source))
67
+ } else if (textures) {
68
+ const t = textures[page.name]
69
+ if (!t) throw new Error(`Missing texture for atlas page: ${page.name}`)
70
+ page.setTexture(SpineTexture.from(t.source))
71
+ }
72
+ })
73
+
74
+ const atlasLoader = new AtlasAttachmentLoader(atlas)
75
+
76
+ // Parse skeleton data depending on available source
77
+ if (this.rawSkeletonData) {
78
+ const jsonLoader = new SkeletonJson(atlasLoader)
79
+ return jsonLoader.readSkeletonData(this.rawSkeletonData)
80
+ }
81
+ if (skeletonBinary) {
82
+ const binLoader = new SkeletonBinary(atlasLoader)
83
+ return binLoader.readSkeletonData(skeletonBinary)
84
+ }
85
+ if (textSkeletonData) {
86
+ const jsonLoader = new SkeletonJson(atlasLoader)
87
+ return jsonLoader.readSkeletonData(textSkeletonData)
88
+ }
89
+ return undefined
90
+ }
91
+
92
+ #getCachedSkeletonData() {
93
+ try {
94
+ if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined
95
+ if (!textLoader.checkCached(this.#atlas)) return undefined
96
+
97
+ const atlasText = textLoader.getCached(this.#atlas)!
98
+
99
+ let texture: Texture | undefined
100
+ let textures: Record<string, Texture> | undefined
101
+
102
+ if (typeof this.#texture === 'string') {
103
+ if (!textureLoader.checkCached(this.#texture)) return undefined
104
+ texture = textureLoader.getCached(this.#texture)!
105
+ } else if (this.#texture) {
106
+ textures = {}
107
+ for (const [key, path] of Object.entries(this.#texture)) {
108
+ if (!textureLoader.checkCached(path)) return undefined
109
+ textures[key] = textureLoader.getCached(path)!
110
+ }
111
+ } else {
112
+ return undefined
113
+ }
114
+
115
+ let skeletonBinary: Uint8Array | undefined
116
+ let textSkeletonData: string | undefined
117
+
118
+ if (!this.#rawSkeletonData) {
119
+ if (this.#skel) {
120
+ if (!binaryLoader.checkCached(this.#skel)) return undefined
121
+ skeletonBinary = binaryLoader.getCached(this.#skel)!
122
+ } else if (this.#json) {
123
+ if (!textLoader.checkCached(this.#json)) return undefined
124
+ textSkeletonData = textLoader.getCached(this.#json)!
125
+ }
126
+ }
127
+
128
+ return this.#buildSkeletonData(
129
+ atlasText,
130
+ texture,
131
+ textures,
132
+ skeletonBinary,
133
+ textSkeletonData,
134
+ )
135
+ } catch (e) {
136
+ console.error('Failed to build skeleton data from cache:', e)
137
+ return undefined
138
+ }
139
+ }
140
+
141
+ async #loadSkeletonData() {
142
+ if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined
143
+
144
+ const promises: Promise<any>[] = []
145
+
146
+ let atlasText: string | undefined
147
+ let skeletonBinary: Uint8Array | undefined
148
+ let textSkeletonData: string | undefined
149
+ let texture: Texture | undefined
150
+ let textures: Record<string, Texture> | undefined
151
+
152
+ // Load atlas (text)
153
+ if (!textLoader.checkCached(this.#atlas)) console.info(`Atlas not preloaded. Loading now: ${this.#atlas}`)
154
+ promises.push((async () => (atlasText = await textLoader.load(this.#atlas)))())
155
+
156
+ // Load skeleton (raw / binary / json)
157
+ if (this.#rawSkeletonData) {
158
+ // already provided
159
+ } else if (this.#skel) {
160
+ if (!binaryLoader.checkCached(this.#skel)) console.info(`Skeleton not preloaded. Loading now: ${this.#skel}`)
161
+ promises.push((async () => (skeletonBinary = await binaryLoader.load(this.#skel!)))())
162
+ } else if (this.#json) {
163
+ if (!textLoader.checkCached(this.#json)) console.info(`Skeleton not preloaded. Loading now: ${this.#json}`)
164
+ promises.push((async () => (textSkeletonData = await textLoader.load(this.#json!)))())
165
+ } else {
166
+ console.error('Either skel or json must be provided')
167
+ return undefined
168
+ }
169
+
170
+ // Load textures (single or multiple)
171
+ if (typeof this.#texture === 'string') {
172
+ if (!textureLoader.checkCached(this.#texture)) console.info(`Texture not preloaded. Loading now: ${this.#texture}`)
173
+ promises.push((async () => (texture = await textureLoader.load(this.#texture as string)))())
174
+ } else if (this.#texture) {
175
+ textures = {}
176
+ for (const [key, path] of Object.entries(this.#texture)) {
177
+ if (!textureLoader.checkCached(path)) console.info(`Texture not preloaded. Loading now: ${path}`)
178
+ promises.push((async () => {
179
+ const t = await textureLoader.load(path)
180
+ if (t) textures![key] = t
181
+ })())
182
+ }
183
+ }
184
+
185
+ await Promise.all(promises)
186
+
187
+ if (!atlasText) return undefined
188
+ if (!texture && !(textures && Object.keys(textures).length)) return undefined
189
+
190
+ return this.#buildSkeletonData(
191
+ atlasText,
192
+ texture,
193
+ textures,
194
+ skeletonBinary,
195
+ textSkeletonData,
196
+ )
197
+ }
198
+
199
+ async #load() {
200
+ let skeletonData = this.#getCachedSkeletonData()
201
+ if (!skeletonData) {
202
+ skeletonData = await this.#loadSkeletonData()
203
+ }
204
+
205
+ this.#spine?.destroy()
206
+ this.#spine = undefined
207
+
208
+ if (skeletonData) {
209
+ const s = new PixiSpine(skeletonData)
210
+ s.state.addListener({
211
+ complete: (e) => (this as any).emit('animationend', e.animation?.name ?? '')
212
+ })
213
+ this.#spine = s
214
+ this.#updateAnimation()
215
+ this.#updateSkins()
216
+ this._pixiContainer.addChild(s)
217
+ }
218
+ }
219
+
220
+ #updateSkins() {
221
+ const s = this.#spine?.skeleton
222
+ if (s && this.#skins) {
223
+ const newSkin = new Skin('combined-skin')
224
+ for (const skinName of this.#skins) {
225
+ const skin = s.data.findSkin(skinName)
226
+ if (skin) newSkin.addSkin(skin)
227
+ }
228
+ s.setSkin(newSkin)
229
+ s.setSlotsToSetupPose()
230
+ }
231
+ }
232
+
233
+ #updateAnimation() {
234
+ const s = this.#spine
235
+ if (s && this.#animation) {
236
+ s.state.setAnimation(0, this.#animation, this.#loop ?? true)
237
+ s.state.apply(s.skeleton)
238
+ }
239
+ }
240
+
241
+ set atlas(atlas) {
242
+ if (this.#atlas !== atlas) {
243
+ this.#atlas = atlas
244
+ this.#load()
245
+ }
246
+ }
247
+
248
+ get atlas() { return this.#atlas }
249
+
250
+ set texture(texture) {
251
+ if (this.#texture !== texture) {
252
+ this.#texture = texture
253
+ this.#load()
254
+ }
255
+ }
256
+
257
+ get texture() { return this.#texture }
258
+
259
+ set rawSkeletonData(rawSkeletonData) {
260
+ if (this.#rawSkeletonData !== rawSkeletonData) {
261
+ this.#rawSkeletonData = rawSkeletonData
262
+ this.#load()
263
+ }
264
+ }
265
+
266
+ get rawSkeletonData() { return this.#rawSkeletonData }
267
+
268
+ set skel(skel) {
269
+ if (this.#skel !== skel) {
270
+ this.#skel = skel
271
+ this.#load()
272
+ }
273
+ }
274
+
275
+ get skel() { return this.#skel }
276
+
277
+ set json(json) {
278
+ if (this.#json !== json) {
279
+ this.#json = json
280
+ this.#load()
281
+ }
282
+ }
283
+
284
+ get json() { return this.#json }
285
+
286
+ set skins(skins) {
287
+ if (this.#skins !== skins) {
288
+ this.#skins = skins
289
+ this.#updateSkins()
290
+ }
291
+ }
292
+
293
+ get skins() { return this.#skins }
294
+
295
+ set animation(animation) {
296
+ if (this.#animation !== animation) {
297
+ this.#animation = animation
298
+ this.#updateAnimation()
299
+ }
300
+ }
301
+
302
+ get animation() { return this.#animation }
303
+
304
+ set loop(loop) {
305
+ if (this.#loop !== loop) {
306
+ this.#loop = loop
307
+ this.#updateAnimation()
308
+ }
309
+ }
310
+
311
+ get loop() { return this.#loop }
312
+
313
+ remove() {
314
+ if (typeof this.#texture === 'string') {
315
+ textureLoader.release(this.#texture)
316
+ } else if (this.#texture) {
317
+ for (const path of Object.values(this.#texture)) {
318
+ textureLoader.release(path)
319
+ }
320
+ }
321
+ super.remove()
322
+ }
323
+ }
@@ -0,0 +1,53 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import { Sprite as PixiSprite } from 'pixi.js'
3
+ import { textureLoader } from '../../asset/loaders/texture'
4
+ import { GameObject, GameObjectOptions } from '../core/game-object'
5
+
6
+ export type SpriteNodeOptions = {
7
+ src: string
8
+ } & GameObjectOptions
9
+
10
+ export class SpriteNode<E extends EventMap = EventMap> extends GameObject<E> {
11
+ #src: string
12
+ #sprite?: PixiSprite
13
+
14
+ constructor(options: SpriteNodeOptions) {
15
+ super(options)
16
+ this.#src = options.src
17
+ this.#load()
18
+ }
19
+
20
+ async #load() {
21
+ let texture
22
+ if (textureLoader.checkCached(this.#src)) {
23
+ texture = textureLoader.getCached(this.#src)
24
+ } else {
25
+ console.info(`Texture not preloaded. Loading now: ${this.#src}`)
26
+ texture = await textureLoader.load(this.#src)
27
+ }
28
+
29
+ this.#sprite?.destroy()
30
+ this.#sprite = undefined
31
+
32
+ if (texture) {
33
+ const s = new PixiSprite({ texture, anchor: 0.5, zIndex: -999999 })
34
+ this._pixiContainer.addChild(s)
35
+ this.#sprite = s
36
+ }
37
+ }
38
+
39
+ set src(src) {
40
+ if (this.#src !== src) {
41
+ textureLoader.release(this.#src)
42
+ this.#src = src
43
+ this.#load()
44
+ }
45
+ }
46
+
47
+ get src() { return this.#src }
48
+
49
+ override remove() {
50
+ textureLoader.release(this.#src)
51
+ super.remove()
52
+ }
53
+ }
@@ -0,0 +1,156 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import Matter, { IChamferableBodyDefinition } from 'matter-js'
3
+ import { Container as PixiContainer } from 'pixi.js'
4
+ import { Collider, ColliderType } from '../../collision/colliders'
5
+ import { GameNode } from '../core/game-node'
6
+ import { isRenderableNode, RenderableNode } from '../core/renderable'
7
+ import { LocalTransform } from '../core/transform'
8
+ import { PhysicsWorld } from './physics-world'
9
+
10
+ function createEllipseBody(
11
+ x: number,
12
+ y: number,
13
+ width: number,
14
+ height: number,
15
+ options: IChamferableBodyDefinition = {},
16
+ // segLen은 "인접 정점 사이의 목표 간격(px)" 정도로 생각하면 됩니다.
17
+ segLen = 6
18
+ ): Matter.Body {
19
+ const rx = width / 2
20
+ const ry = height / 2
21
+
22
+ // 주변길이 ~ π(a+b) 근사 → 그 길이를 segLen 간격으로 쪼개서 정점 수 결정
23
+ const perimeterApprox = Math.PI * (rx + ry)
24
+ const segments = Math.max(12, Math.ceil(perimeterApprox / segLen))
25
+
26
+ const verts = Array.from({ length: segments }, (_, i) => {
27
+ const t = (i / segments) * Math.PI * 2
28
+ return { x: Math.cos(t) * rx, y: Math.sin(t) * ry }
29
+ })
30
+
31
+ // fromVertices는 로컬 기준이므로 x,y는 중심 위치로 넘깁니다.
32
+ return Matter.Bodies.fromVertices(x, y, [verts], options)
33
+ }
34
+
35
+ export type PhysicsObjectOptions = {
36
+ collider: Collider
37
+ x?: number
38
+ y?: number
39
+ rotation?: number
40
+ fixedRotation?: boolean
41
+ velocityX?: number
42
+ velocityY?: number
43
+ isStatic?: boolean
44
+
45
+ useYSort?: boolean
46
+ }
47
+
48
+ export class PhysicsObject<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {
49
+ #localTransform = new LocalTransform()
50
+ #matterBody: Matter.Body
51
+
52
+ #useYSort = false
53
+
54
+ constructor(options: PhysicsObjectOptions) {
55
+ super(new PixiContainer({ sortableChildren: true }))
56
+
57
+ const c = options.collider
58
+ const x = options.x ?? 0
59
+ const y = options.y ?? 0
60
+
61
+ const bodyOptions: IChamferableBodyDefinition = {
62
+ angle: options.rotation ?? 0,
63
+ velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },
64
+ isStatic: options.isStatic ?? false
65
+ }
66
+
67
+ if (options.fixedRotation) {
68
+ bodyOptions.inertia = Infinity
69
+ bodyOptions.angularVelocity = 0
70
+ }
71
+
72
+ if (c.type === ColliderType.Rectangle) {
73
+ this.#matterBody = Matter.Bodies.rectangle(x, y, c.width, c.height, bodyOptions)
74
+ } else if (c.type === ColliderType.Circle) {
75
+ this.#matterBody = Matter.Bodies.circle(x, y, c.radius, bodyOptions)
76
+ } else if (c.type === ColliderType.Ellipse) {
77
+ this.#matterBody = createEllipseBody(
78
+ x, y, c.width, c.height, bodyOptions,
79
+ /* segLen= */ 6 // 더 매끄럽게 하고 싶으면 더 작게
80
+ )
81
+ } else if (c.type === ColliderType.Polygon) {
82
+ this.#matterBody = Matter.Bodies.fromVertices(x, y, [c.vertices], bodyOptions)
83
+ } else {
84
+ throw new Error('Invalid collider type')
85
+ }
86
+
87
+ this.#useYSort = options.useYSort ?? false
88
+ }
89
+
90
+ protected override set parent(parent: GameNode<EventMap> | undefined) {
91
+ if (!(parent instanceof PhysicsWorld)) {
92
+ const actual = parent === undefined
93
+ ? 'undefined'
94
+ : parent.constructor?.name ?? typeof parent
95
+ throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`)
96
+ }
97
+ parent.addBody(this.#matterBody)
98
+ super.parent = parent
99
+ }
100
+
101
+ protected override get parent() {
102
+ return super.parent
103
+ }
104
+
105
+ override _updateWorldTransform() {
106
+ const mb = this.#matterBody
107
+
108
+ const pc = this._pixiContainer
109
+ pc.position.set(mb.position.x, mb.position.y)
110
+ if (this.#useYSort) pc.zIndex = mb.position.y
111
+ pc.rotation = mb.angle
112
+
113
+ const lt = this.#localTransform
114
+ lt.x = mb.position.x
115
+ lt.y = mb.position.y
116
+ lt.rotation = mb.angle
117
+
118
+ const parent = this.parent
119
+ if (parent && isRenderableNode(parent)) {
120
+ this.worldTransform.update(parent.worldTransform, this.#localTransform)
121
+ }
122
+
123
+ super._updateWorldTransform()
124
+ }
125
+
126
+ #removeFromWorld() {
127
+ (this.parent as PhysicsWorld)?.removeBody(this.#matterBody)
128
+ }
129
+
130
+ override remove() {
131
+ this.#removeFromWorld()
132
+ super.remove()
133
+ }
134
+
135
+ set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }) }
136
+ get x() { return this.#matterBody.position.x }
137
+
138
+ set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }) }
139
+ get y() { return this.#matterBody.position.y }
140
+
141
+ set rotation(v) { Matter.Body.setAngle(this.#matterBody, v) }
142
+ get rotation() { return this.#matterBody.angle }
143
+
144
+ set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }) }
145
+ get velocityX() { return this.#matterBody.velocity.x }
146
+
147
+ set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }) }
148
+ get velocityY() { return this.#matterBody.velocity.y }
149
+
150
+ set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v) }
151
+ get isStatic() { return this.#matterBody.isStatic }
152
+
153
+ disableCollisions() {
154
+ this.#removeFromWorld()
155
+ }
156
+ }
@@ -0,0 +1,40 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import Matter from 'matter-js'
3
+ import { Container as PixiContainer } from 'pixi.js'
4
+ import { RenderableNode } from '../core/renderable'
5
+
6
+ export type PhysicsWorldOptions = {
7
+ gravity?: number
8
+ }
9
+
10
+ export class PhysicsWorld<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {
11
+ #matterEngine = Matter.Engine.create()
12
+
13
+ constructor(options?: PhysicsWorldOptions) {
14
+ super(new PixiContainer({ sortableChildren: true }))
15
+
16
+ this.worldTransform.x.v = 0
17
+ this.worldTransform.y.v = 0
18
+ this.worldTransform.resetDirty()
19
+
20
+ this.gravity = options?.gravity ?? 0
21
+ }
22
+
23
+ set gravity(v) { this.#matterEngine.gravity.y = v }
24
+ get gravity() { return this.#matterEngine.gravity.y }
25
+
26
+ addBody(body: Matter.Body) { Matter.World.add(this.#matterEngine.world, body) }
27
+ removeBody(body: Matter.Body) { Matter.World.remove(this.#matterEngine.world, body) }
28
+
29
+ protected override update(dt: number) {
30
+ super.update(dt)
31
+
32
+ const matterDt = dt * 1000
33
+ Matter.Engine.update(this.#matterEngine, matterDt > 16.666 ? 16.666 : matterDt)
34
+ }
35
+
36
+ override remove() {
37
+ Matter.Engine.clear(this.#matterEngine)
38
+ super.remove()
39
+ }
40
+ }
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter'
2
+
3
+ export class Camera extends EventEmitter<{
4
+ positionChanged: () => void
5
+ scaleChanged: () => void
6
+ }> {
7
+ #x = 0
8
+ #y = 0
9
+ #scale = 1
10
+
11
+ get x() { return this.#x }
12
+ get y() { return this.#y }
13
+ get scale() { return this.#scale }
14
+
15
+ setPosition(x: number, y: number) {
16
+ this.#x = x
17
+ this.#y = y
18
+ this.emit('positionChanged')
19
+ }
20
+
21
+ setScale(scale: number) {
22
+ this.#scale = scale
23
+ this.emit('scaleChanged')
24
+ }
25
+ }
@@ -0,0 +1,36 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter'
2
+ import { DirtyNumber } from '../node/core/dirty-number'
3
+
4
+ export class RendererContainerManager extends EventEmitter<{
5
+ resize: (width: number, height: number) => void
6
+ }> {
7
+ #container: HTMLElement
8
+ #containerResizeObserver: ResizeObserver
9
+ #containerWidth = new DirtyNumber(0)
10
+ #containerHeight = new DirtyNumber(0)
11
+
12
+ constructor(container: HTMLElement) {
13
+ super()
14
+ this.#container = container
15
+ this.#containerResizeObserver = new ResizeObserver(this.#resizeListener.bind(this))
16
+ this.#containerResizeObserver.observe(container)
17
+ }
18
+
19
+ #resizeListener() {
20
+ const cr = this.#container.getBoundingClientRect()
21
+ this.#containerWidth.v = cr.width
22
+ this.#containerHeight.v = cr.height
23
+
24
+ if (this.#containerWidth.dirty || this.#containerHeight.dirty) {
25
+ this.emit('resize', this.#containerWidth.v, this.#containerHeight.v)
26
+
27
+ this.#containerWidth.resetDirty()
28
+ this.#containerHeight.resetDirty()
29
+ }
30
+ }
31
+
32
+ override remove() {
33
+ this.#containerResizeObserver.disconnect()
34
+ super.remove()
35
+ }
36
+ }
@@ -0,0 +1,21 @@
1
+ import Stats from 'stats.js'
2
+
3
+ export class FpsDisplay {
4
+ #stats: Stats
5
+
6
+ constructor(container: HTMLElement) {
7
+ const stats = new Stats()
8
+ stats.dom.style.position = 'absolute'
9
+ stats.showPanel(0)
10
+ container.appendChild(stats.dom)
11
+ this.#stats = stats
12
+ }
13
+
14
+ update() {
15
+ this.#stats.update()
16
+ }
17
+
18
+ remove() {
19
+ this.#stats.dom.remove()
20
+ }
21
+ }
@@ -0,0 +1,15 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import { Container as PixiContainer } from 'pixi.js'
3
+ import { RenderableNode } from '../node/core/renderable'
4
+
5
+ export class Layer extends RenderableNode<PixiContainer, EventMap> {
6
+ constructor(drawOrder: number) {
7
+ super(new PixiContainer({ sortableChildren: true }))
8
+
9
+ this._pixiContainer.zIndex = drawOrder
10
+
11
+ this.worldTransform.x.v = 0
12
+ this.worldTransform.y.v = 0
13
+ this.worldTransform.resetDirty()
14
+ }
15
+ }