kiwiengine 0.0.1-alpha → 0.5.3

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 (599) hide show
  1. package/README.ko.md +550 -0
  2. package/README.md +575 -4
  3. package/examples/auto-battle/assets/bgm/battle.mp3 +0 -0
  4. package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  5. package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
  6. package/examples/auto-battle/assets/joystick/joystick.png +0 -0
  7. package/examples/auto-battle/assets/joystick/knob.png +0 -0
  8. package/examples/auto-battle/assets/sfx/hero/die/die.wav +0 -0
  9. package/examples/auto-battle/assets/sfx/hero/heal/heal.wav +0 -0
  10. package/examples/auto-battle/assets/sfx/hero/hit/hit1.wav +0 -0
  11. package/examples/auto-battle/assets/sfx/hero/hit/hit2.wav +0 -0
  12. package/examples/auto-battle/assets/sfx/hero/hit/hit3.wav +0 -0
  13. package/examples/auto-battle/assets/sfx/hero/miss/miss1.wav +0 -0
  14. package/examples/auto-battle/assets/sfx/hero/miss/miss2.wav +0 -0
  15. package/examples/auto-battle/assets/sfx/hero/miss/miss3.wav +0 -0
  16. package/examples/auto-battle/assets/sfx/orc/die/die.wav +0 -0
  17. package/examples/auto-battle/assets/sfx/orc/hit/hit1.wav +0 -0
  18. package/examples/auto-battle/assets/sfx/orc/hit/hit2.wav +0 -0
  19. package/examples/auto-battle/assets/sfx/orc/hit/hit3.wav +0 -0
  20. package/examples/auto-battle/assets/sfx/orc/miss/miss1.wav +0 -0
  21. package/examples/auto-battle/assets/sfx/orc/miss/miss2.wav +0 -0
  22. package/examples/auto-battle/assets/sfx/orc/miss/miss3.wav +0 -0
  23. package/examples/auto-battle/assets/spritesheets/hero-atlas.json +246 -0
  24. package/examples/auto-battle/assets/spritesheets/hero.png +0 -0
  25. package/examples/auto-battle/assets/spritesheets/orc-atlas.json +246 -0
  26. package/examples/auto-battle/assets/spritesheets/orc.png +0 -0
  27. package/examples/auto-battle/assets/spritesheets/potion-atlas.json +68 -0
  28. package/examples/auto-battle/assets/spritesheets/potion.png +0 -0
  29. package/examples/auto-battle/dist/game.js +2 -0
  30. package/examples/auto-battle/dist/game.js.LICENSE.txt +35 -0
  31. package/examples/auto-battle/hud/damage-text.ts +46 -0
  32. package/examples/auto-battle/hud/heal-text.ts +46 -0
  33. package/examples/auto-battle/hud/hp-bar.ts +38 -0
  34. package/examples/auto-battle/index.ts +41 -0
  35. package/examples/auto-battle/objects/character.ts +95 -0
  36. package/examples/auto-battle/objects/hero.ts +119 -0
  37. package/examples/auto-battle/objects/orc.ts +107 -0
  38. package/examples/auto-battle/objects/potion.ts +27 -0
  39. package/examples/auto-battle/stage.ts +366 -0
  40. package/examples/battle-benchmark-matterjs/assets/bgm/battle.mp3 +0 -0
  41. package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  42. package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.png +0 -0
  43. package/examples/battle-benchmark-matterjs/assets/joystick/joystick.png +0 -0
  44. package/examples/battle-benchmark-matterjs/assets/joystick/knob.png +0 -0
  45. package/examples/battle-benchmark-matterjs/assets/sfx/hero/die/die.wav +0 -0
  46. package/examples/battle-benchmark-matterjs/assets/sfx/hero/heal/heal.wav +0 -0
  47. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit1.wav +0 -0
  48. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit2.wav +0 -0
  49. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit3.wav +0 -0
  50. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss1.wav +0 -0
  51. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss2.wav +0 -0
  52. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss3.wav +0 -0
  53. package/examples/battle-benchmark-matterjs/assets/sfx/orc/die/die.wav +0 -0
  54. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit1.wav +0 -0
  55. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit2.wav +0 -0
  56. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit3.wav +0 -0
  57. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss1.wav +0 -0
  58. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss2.wav +0 -0
  59. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss3.wav +0 -0
  60. package/examples/battle-benchmark-matterjs/assets/spritesheets/hero-atlas.json +246 -0
  61. package/examples/battle-benchmark-matterjs/assets/spritesheets/hero.png +0 -0
  62. package/examples/battle-benchmark-matterjs/assets/spritesheets/orc-atlas.json +246 -0
  63. package/examples/battle-benchmark-matterjs/assets/spritesheets/orc.png +0 -0
  64. package/examples/battle-benchmark-matterjs/assets/spritesheets/potion-atlas.json +68 -0
  65. package/examples/battle-benchmark-matterjs/assets/spritesheets/potion.png +0 -0
  66. package/examples/battle-benchmark-matterjs/dist/game.js +2 -0
  67. package/examples/battle-benchmark-matterjs/dist/game.js.LICENSE.txt +35 -0
  68. package/examples/battle-benchmark-matterjs/hud/damage-text.ts +46 -0
  69. package/examples/battle-benchmark-matterjs/hud/heal-text.ts +46 -0
  70. package/examples/battle-benchmark-matterjs/hud/hp-bar.ts +38 -0
  71. package/examples/battle-benchmark-matterjs/index.html +24 -0
  72. package/examples/battle-benchmark-matterjs/index.ts +41 -0
  73. package/examples/battle-benchmark-matterjs/objects/character.ts +95 -0
  74. package/examples/battle-benchmark-matterjs/objects/hero.ts +111 -0
  75. package/examples/battle-benchmark-matterjs/objects/orc.ts +107 -0
  76. package/examples/battle-benchmark-matterjs/objects/potion.ts +27 -0
  77. package/examples/battle-benchmark-matterjs/stage.ts +177 -0
  78. package/examples/battle-benchmark-separation/assets/bgm/battle.mp3 +0 -0
  79. package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  80. package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.png +0 -0
  81. package/examples/battle-benchmark-separation/assets/joystick/joystick.png +0 -0
  82. package/examples/battle-benchmark-separation/assets/joystick/knob.png +0 -0
  83. package/examples/battle-benchmark-separation/assets/sfx/hero/die/die.wav +0 -0
  84. package/examples/battle-benchmark-separation/assets/sfx/hero/heal/heal.wav +0 -0
  85. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit1.wav +0 -0
  86. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit2.wav +0 -0
  87. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit3.wav +0 -0
  88. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss1.wav +0 -0
  89. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss2.wav +0 -0
  90. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss3.wav +0 -0
  91. package/examples/battle-benchmark-separation/assets/sfx/orc/die/die.wav +0 -0
  92. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit1.wav +0 -0
  93. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit2.wav +0 -0
  94. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit3.wav +0 -0
  95. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss1.wav +0 -0
  96. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss2.wav +0 -0
  97. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss3.wav +0 -0
  98. package/examples/battle-benchmark-separation/assets/spritesheets/hero-atlas.json +246 -0
  99. package/examples/battle-benchmark-separation/assets/spritesheets/hero.png +0 -0
  100. package/examples/battle-benchmark-separation/assets/spritesheets/orc-atlas.json +246 -0
  101. package/examples/battle-benchmark-separation/assets/spritesheets/orc.png +0 -0
  102. package/examples/battle-benchmark-separation/assets/spritesheets/potion-atlas.json +68 -0
  103. package/examples/battle-benchmark-separation/assets/spritesheets/potion.png +0 -0
  104. package/examples/battle-benchmark-separation/dist/game.js +2 -0
  105. package/examples/battle-benchmark-separation/dist/game.js.LICENSE.txt +35 -0
  106. package/examples/battle-benchmark-separation/hud/damage-text.ts +46 -0
  107. package/examples/battle-benchmark-separation/hud/heal-text.ts +46 -0
  108. package/examples/battle-benchmark-separation/hud/hp-bar.ts +38 -0
  109. package/examples/battle-benchmark-separation/index.html +24 -0
  110. package/examples/battle-benchmark-separation/index.ts +41 -0
  111. package/examples/battle-benchmark-separation/objects/character.ts +225 -0
  112. package/examples/battle-benchmark-separation/objects/hero.ts +110 -0
  113. package/examples/battle-benchmark-separation/objects/orc.ts +213 -0
  114. package/examples/battle-benchmark-separation/objects/potion.ts +27 -0
  115. package/examples/battle-benchmark-separation/stage.ts +178 -0
  116. package/examples/battle-benchmark-separation2/assets/bgm/battle.mp3 +0 -0
  117. package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  118. package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.png +0 -0
  119. package/examples/battle-benchmark-separation2/assets/joystick/joystick.png +0 -0
  120. package/examples/battle-benchmark-separation2/assets/joystick/knob.png +0 -0
  121. package/examples/battle-benchmark-separation2/assets/sfx/hero/die/die.wav +0 -0
  122. package/examples/battle-benchmark-separation2/assets/sfx/hero/heal/heal.wav +0 -0
  123. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit1.wav +0 -0
  124. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit2.wav +0 -0
  125. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit3.wav +0 -0
  126. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss1.wav +0 -0
  127. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss2.wav +0 -0
  128. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss3.wav +0 -0
  129. package/examples/battle-benchmark-separation2/assets/sfx/orc/die/die.wav +0 -0
  130. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit1.wav +0 -0
  131. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit2.wav +0 -0
  132. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit3.wav +0 -0
  133. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss1.wav +0 -0
  134. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss2.wav +0 -0
  135. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss3.wav +0 -0
  136. package/examples/battle-benchmark-separation2/assets/spritesheets/hero-atlas.json +246 -0
  137. package/examples/battle-benchmark-separation2/assets/spritesheets/hero.png +0 -0
  138. package/examples/battle-benchmark-separation2/assets/spritesheets/orc-atlas.json +246 -0
  139. package/examples/battle-benchmark-separation2/assets/spritesheets/orc.png +0 -0
  140. package/examples/battle-benchmark-separation2/assets/spritesheets/potion-atlas.json +68 -0
  141. package/examples/battle-benchmark-separation2/assets/spritesheets/potion.png +0 -0
  142. package/examples/battle-benchmark-separation2/dist/game.js +2 -0
  143. package/examples/battle-benchmark-separation2/dist/game.js.LICENSE.txt +35 -0
  144. package/examples/battle-benchmark-separation2/hud/damage-text.ts +46 -0
  145. package/examples/battle-benchmark-separation2/hud/heal-text.ts +46 -0
  146. package/examples/battle-benchmark-separation2/hud/hp-bar.ts +38 -0
  147. package/examples/battle-benchmark-separation2/index.html +24 -0
  148. package/examples/battle-benchmark-separation2/index.ts +41 -0
  149. package/examples/battle-benchmark-separation2/objects/character.ts +195 -0
  150. package/examples/battle-benchmark-separation2/objects/hero.ts +110 -0
  151. package/examples/battle-benchmark-separation2/objects/orc.ts +213 -0
  152. package/examples/battle-benchmark-separation2/objects/potion.ts +27 -0
  153. package/examples/battle-benchmark-separation2/stage.ts +178 -0
  154. package/examples/collision-test/assets/cat.png +0 -0
  155. package/examples/collision-test/dist/game.js +2 -0
  156. package/examples/collision-test/dist/game.js.LICENSE.txt +35 -0
  157. package/examples/collision-test/index.html +24 -0
  158. package/examples/collision-test/index.ts +30 -0
  159. package/examples/dom-particle-test/assets/bird.png +0 -0
  160. package/examples/dom-particle-test/dist/game.js +2 -0
  161. package/examples/dom-particle-test/dist/game.js.LICENSE.txt +35 -0
  162. package/examples/dom-particle-test/index.html +24 -0
  163. package/examples/dom-particle-test/index.ts +27 -0
  164. package/examples/dom-sprite-test/assets/bird.png +0 -0
  165. package/examples/dom-sprite-test/assets/fire.png +0 -0
  166. package/examples/dom-sprite-test/assets/run.png +0 -0
  167. package/examples/dom-sprite-test/dist/game.js +2 -0
  168. package/examples/dom-sprite-test/dist/game.js.LICENSE.txt +35 -0
  169. package/examples/dom-sprite-test/index.html +24 -0
  170. package/examples/dom-sprite-test/index.ts +35 -0
  171. package/examples/dom-test/dist/game.js +2 -0
  172. package/examples/dom-test/dist/game.js.LICENSE.txt +35 -0
  173. package/examples/dom-test/index.html +24 -0
  174. package/examples/dom-test/index.ts +22 -0
  175. package/examples/particle-test/assets/bird.png +0 -0
  176. package/examples/particle-test/dist/game.js +2 -0
  177. package/examples/particle-test/dist/game.js.LICENSE.txt +35 -0
  178. package/examples/particle-test/index.html +24 -0
  179. package/examples/particle-test/index.ts +30 -0
  180. package/examples/renderer-test/dist/game.js +2 -0
  181. package/examples/renderer-test/dist/game.js.LICENSE.txt +35 -0
  182. package/examples/renderer-test/index.html +24 -0
  183. package/examples/renderer-test/index.ts +9 -0
  184. package/examples/simple-battle/assets/bgm/battle.mp3 +0 -0
  185. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  186. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
  187. package/examples/simple-battle/assets/joystick/joystick.png +0 -0
  188. package/examples/simple-battle/assets/joystick/knob.png +0 -0
  189. package/examples/simple-battle/assets/sfx/hero/die/die.wav +0 -0
  190. package/examples/simple-battle/assets/sfx/hero/heal/heal.wav +0 -0
  191. package/examples/simple-battle/assets/sfx/hero/hit/hit1.wav +0 -0
  192. package/examples/simple-battle/assets/sfx/hero/hit/hit2.wav +0 -0
  193. package/examples/simple-battle/assets/sfx/hero/hit/hit3.wav +0 -0
  194. package/examples/simple-battle/assets/sfx/hero/miss/miss1.wav +0 -0
  195. package/examples/simple-battle/assets/sfx/hero/miss/miss2.wav +0 -0
  196. package/examples/simple-battle/assets/sfx/hero/miss/miss3.wav +0 -0
  197. package/examples/simple-battle/assets/sfx/orc/die/die.wav +0 -0
  198. package/examples/simple-battle/assets/sfx/orc/hit/hit1.wav +0 -0
  199. package/examples/simple-battle/assets/sfx/orc/hit/hit2.wav +0 -0
  200. package/examples/simple-battle/assets/sfx/orc/hit/hit3.wav +0 -0
  201. package/examples/simple-battle/assets/sfx/orc/miss/miss1.wav +0 -0
  202. package/examples/simple-battle/assets/sfx/orc/miss/miss2.wav +0 -0
  203. package/examples/simple-battle/assets/sfx/orc/miss/miss3.wav +0 -0
  204. package/examples/simple-battle/assets/spritesheets/hero-atlas.json +246 -0
  205. package/examples/simple-battle/assets/spritesheets/hero.png +0 -0
  206. package/examples/simple-battle/assets/spritesheets/orc-atlas.json +246 -0
  207. package/examples/simple-battle/assets/spritesheets/orc.png +0 -0
  208. package/examples/simple-battle/assets/spritesheets/potion-atlas.json +68 -0
  209. package/examples/simple-battle/assets/spritesheets/potion.png +0 -0
  210. package/examples/simple-battle/dist/game.js +2 -0
  211. package/examples/simple-battle/dist/game.js.LICENSE.txt +35 -0
  212. package/examples/simple-battle/hud/damage-text.ts +46 -0
  213. package/examples/simple-battle/hud/heal-text.ts +46 -0
  214. package/examples/simple-battle/hud/hp-bar.ts +38 -0
  215. package/examples/simple-battle/index.html +24 -0
  216. package/examples/simple-battle/index.ts +41 -0
  217. package/examples/simple-battle/objects/character.ts +95 -0
  218. package/examples/simple-battle/objects/hero.ts +111 -0
  219. package/examples/simple-battle/objects/orc.ts +107 -0
  220. package/examples/simple-battle/objects/potion.ts +27 -0
  221. package/examples/simple-battle/stage.ts +174 -0
  222. package/examples/spine-test/assets/spine/spineboy.atlas +95 -0
  223. package/examples/spine-test/assets/spine/spineboy.png +0 -0
  224. package/examples/spine-test/assets/spine/spineboy.skel +0 -0
  225. package/examples/spine-test/dist/game.js +2 -0
  226. package/examples/spine-test/dist/game.js.LICENSE.txt +35 -0
  227. package/examples/spine-test/index.html +24 -0
  228. package/examples/spine-test/index.ts +29 -0
  229. package/examples/sprite-test/assets/bird.png +0 -0
  230. package/examples/sprite-test/assets/fire.png +0 -0
  231. package/examples/sprite-test/dist/game.js +2 -0
  232. package/examples/sprite-test/dist/game.js.LICENSE.txt +35 -0
  233. package/examples/sprite-test/index.html +24 -0
  234. package/examples/sprite-test/index.ts +38 -0
  235. package/examples/tsconfig.json +2 -1
  236. package/examples/webpack.config.js +17 -3
  237. package/jest.config.ts +10 -0
  238. package/lib/asset/audio.js +47 -11
  239. package/lib/asset/audio.js.map +1 -1
  240. package/lib/asset/loaders/audio.js +7 -4
  241. package/lib/asset/loaders/audio.js.map +1 -1
  242. package/lib/asset/loaders/binary.js +7 -4
  243. package/lib/asset/loaders/binary.js.map +1 -1
  244. package/lib/asset/loaders/bitmap-font.js +74 -0
  245. package/lib/asset/loaders/bitmap-font.js.map +1 -0
  246. package/lib/asset/loaders/font.js +4 -1
  247. package/lib/asset/loaders/font.js.map +1 -1
  248. package/lib/asset/loaders/loader.js +17 -12
  249. package/lib/asset/loaders/loader.js.map +1 -1
  250. package/lib/asset/loaders/spritesheet.js +18 -8
  251. package/lib/asset/loaders/spritesheet.js.map +1 -1
  252. package/lib/asset/loaders/text.js +6 -3
  253. package/lib/asset/loaders/text.js.map +1 -1
  254. package/lib/asset/loaders/texture.js +22 -26
  255. package/lib/asset/loaders/texture.js.map +1 -1
  256. package/lib/asset/preload.js +60 -56
  257. package/lib/asset/preload.js.map +1 -1
  258. package/lib/collision/check-collision.js +804 -0
  259. package/lib/collision/check-collision.js.map +1 -0
  260. package/lib/collision/check-collision.test.js +300 -0
  261. package/lib/collision/check-collision.test.js.map +1 -0
  262. package/lib/collision/colliders.js +8 -0
  263. package/lib/collision/colliders.js.map +1 -0
  264. package/lib/debug.js.map +1 -0
  265. package/lib/dom/dom-animated-sprite.js +106 -0
  266. package/lib/dom/dom-animated-sprite.js.map +1 -0
  267. package/lib/dom/dom-game-object.js +108 -0
  268. package/lib/dom/dom-game-object.js.map +1 -0
  269. package/lib/dom/dom-particle.js +105 -0
  270. package/lib/dom/dom-particle.js.map +1 -0
  271. package/lib/dom/dom-preload.js +43 -0
  272. package/lib/dom/dom-preload.js.map +1 -0
  273. package/lib/dom/dom-sprite.js +40 -0
  274. package/lib/dom/dom-sprite.js.map +1 -0
  275. package/lib/dom/dom-texture-loader.js +36 -0
  276. package/lib/dom/dom-texture-loader.js.map +1 -0
  277. package/lib/dom/dom-utils.js +20 -0
  278. package/lib/dom/dom-utils.js.map +1 -0
  279. package/lib/index copy.js +16 -0
  280. package/lib/index copy.js.map +1 -0
  281. package/lib/index.js +36 -10
  282. package/lib/index.js.map +1 -1
  283. package/lib/input/joystick.js +262 -0
  284. package/lib/input/joystick.js.map +1 -0
  285. package/lib/node/core/dirty-number.js +19 -0
  286. package/lib/node/core/dirty-number.js.map +1 -0
  287. package/lib/node/core/game-node.js +63 -0
  288. package/lib/node/core/game-node.js.map +1 -0
  289. package/lib/node/core/game-object.js +8 -0
  290. package/lib/node/core/game-object.js.map +1 -0
  291. package/lib/node/core/renderable.js +59 -0
  292. package/lib/node/core/renderable.js.map +1 -0
  293. package/lib/node/core/transform.js +70 -0
  294. package/lib/node/core/transform.js.map +1 -0
  295. package/lib/node/core/transformable.js +85 -0
  296. package/lib/node/core/transformable.js.map +1 -0
  297. package/lib/node/ext/animated-sprite.js +77 -0
  298. package/lib/node/ext/animated-sprite.js.map +1 -0
  299. package/lib/node/ext/bitmap-text.js +93 -0
  300. package/lib/node/ext/bitmap-text.js.map +1 -0
  301. package/lib/node/ext/circle.js +43 -0
  302. package/lib/node/ext/circle.js.map +1 -0
  303. package/lib/node/ext/deplay.js +22 -0
  304. package/lib/node/ext/deplay.js.map +1 -0
  305. package/lib/node/ext/dom-container.js +51 -0
  306. package/lib/node/ext/dom-container.js.map +1 -0
  307. package/lib/node/ext/interval.js +22 -0
  308. package/lib/node/ext/interval.js.map +1 -0
  309. package/lib/node/ext/particle.js +98 -0
  310. package/lib/node/ext/particle.js.map +1 -0
  311. package/lib/node/ext/rectangle.js +52 -0
  312. package/lib/node/ext/rectangle.js.map +1 -0
  313. package/lib/node/ext/spine.js +272 -0
  314. package/lib/node/ext/spine.js.map +1 -0
  315. package/lib/node/ext/sprite.js +42 -0
  316. package/lib/node/ext/sprite.js.map +1 -0
  317. package/lib/node/physics/physics-object.js +92 -0
  318. package/lib/node/physics/physics-object.js.map +1 -0
  319. package/lib/node/physics/physics-world.js +29 -0
  320. package/lib/node/physics/physics-world.js.map +1 -0
  321. package/lib/node/physics/rigidbodies.js +7 -0
  322. package/lib/node/physics/rigidbodies.js.map +1 -0
  323. package/lib/renderer/camera.js +19 -0
  324. package/lib/renderer/camera.js.map +1 -0
  325. package/lib/renderer/container-manager.js +29 -0
  326. package/lib/renderer/container-manager.js.map +1 -0
  327. package/lib/renderer/fps-display.js +18 -0
  328. package/lib/renderer/fps-display.js.map +1 -0
  329. package/lib/renderer/layer.js +12 -0
  330. package/lib/renderer/layer.js.map +1 -0
  331. package/lib/renderer/renderer.js +146 -0
  332. package/lib/renderer/renderer.js.map +1 -0
  333. package/lib/renderer/ticker.js +56 -0
  334. package/lib/renderer/ticker.js.map +1 -0
  335. package/lib/renderer/ticker.test.js +241 -0
  336. package/lib/renderer/ticker.test.js.map +1 -0
  337. package/lib/types/animation-atlas.js +2 -0
  338. package/lib/types/animation-atlas.js.map +1 -0
  339. package/lib/types/asset/audio.d.ts +5 -4
  340. package/lib/types/asset/audio.d.ts.map +1 -1
  341. package/lib/types/asset/loaders/audio.d.ts +2 -1
  342. package/lib/types/asset/loaders/audio.d.ts.map +1 -1
  343. package/lib/types/asset/loaders/binary.d.ts +2 -1
  344. package/lib/types/asset/loaders/binary.d.ts.map +1 -1
  345. package/lib/types/asset/loaders/bitmap-font.d.ts +17 -0
  346. package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -0
  347. package/lib/types/asset/loaders/font.d.ts +2 -1
  348. package/lib/types/asset/loaders/font.d.ts.map +1 -1
  349. package/lib/types/asset/loaders/loader.d.ts +6 -6
  350. package/lib/types/asset/loaders/loader.d.ts.map +1 -1
  351. package/lib/types/asset/loaders/spritesheet.d.ts +14 -6
  352. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
  353. package/lib/types/asset/loaders/text.d.ts +2 -1
  354. package/lib/types/asset/loaders/text.d.ts.map +1 -1
  355. package/lib/types/asset/loaders/texture.d.ts +2 -2
  356. package/lib/types/asset/loaders/texture.d.ts.map +1 -1
  357. package/lib/types/asset/preload.d.ts +7 -5
  358. package/lib/types/asset/preload.d.ts.map +1 -1
  359. package/lib/types/atlas copy.js +2 -0
  360. package/lib/types/atlas copy.js.map +1 -0
  361. package/lib/types/atlas.js +2 -0
  362. package/lib/types/atlas.js.map +1 -0
  363. package/lib/types/bitmap-font.js +2 -0
  364. package/lib/types/bitmap-font.js.map +1 -0
  365. package/lib/types/collision/check-collision.d.ts +4 -0
  366. package/lib/types/collision/check-collision.d.ts.map +1 -0
  367. package/lib/types/collision/check-collision.test.d.ts +2 -0
  368. package/lib/types/collision/check-collision.test.d.ts.map +1 -0
  369. package/lib/types/collision/colliders.d.ts +34 -0
  370. package/lib/types/collision/colliders.d.ts.map +1 -0
  371. package/lib/types/debug.d.ts.map +1 -0
  372. package/lib/types/dom/dom-animated-sprite.d.ts +23 -0
  373. package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -0
  374. package/lib/types/dom/dom-game-object.d.ts +44 -0
  375. package/lib/types/dom/dom-game-object.d.ts.map +1 -0
  376. package/lib/types/dom/dom-particle.d.ts +30 -0
  377. package/lib/types/dom/dom-particle.d.ts.map +1 -0
  378. package/lib/types/dom/dom-preload.d.ts +2 -0
  379. package/lib/types/dom/dom-preload.d.ts.map +1 -0
  380. package/lib/types/dom/dom-sprite.d.ts +13 -0
  381. package/lib/types/dom/dom-sprite.d.ts.map +1 -0
  382. package/lib/types/dom/dom-texture-loader.d.ts +8 -0
  383. package/lib/types/dom/dom-texture-loader.d.ts.map +1 -0
  384. package/lib/types/dom/dom-utils.d.ts +3 -0
  385. package/lib/types/dom/dom-utils.d.ts.map +1 -0
  386. package/lib/types/index copy.d.ts +16 -0
  387. package/lib/types/index copy.d.ts.map +1 -0
  388. package/lib/types/index.d.ts +26 -11
  389. package/lib/types/index.d.ts.map +1 -1
  390. package/lib/types/input/joystick.d.ts +28 -0
  391. package/lib/types/input/joystick.d.ts.map +1 -0
  392. package/lib/types/node/core/dirty-number.d.ts +9 -0
  393. package/lib/types/node/core/dirty-number.d.ts.map +1 -0
  394. package/lib/types/node/core/game-node.d.ts +16 -0
  395. package/lib/types/node/core/game-node.d.ts.map +1 -0
  396. package/lib/types/node/core/game-object.d.ts +8 -0
  397. package/lib/types/node/core/game-object.d.ts.map +1 -0
  398. package/lib/types/node/core/renderable.d.ts +23 -0
  399. package/lib/types/node/core/renderable.d.ts.map +1 -0
  400. package/lib/types/node/core/transform.d.ts +27 -0
  401. package/lib/types/node/core/transform.d.ts.map +1 -0
  402. package/lib/types/node/core/transformable.d.ts +44 -0
  403. package/lib/types/node/core/transformable.d.ts.map +1 -0
  404. package/lib/types/node/ext/animated-sprite.d.ts +22 -0
  405. package/lib/types/node/ext/animated-sprite.d.ts.map +1 -0
  406. package/lib/types/node/ext/bitmap-text.d.ts +14 -0
  407. package/lib/types/node/ext/bitmap-text.d.ts.map +1 -0
  408. package/lib/types/node/ext/circle.d.ts +19 -0
  409. package/lib/types/node/ext/circle.d.ts.map +1 -0
  410. package/lib/types/node/ext/deplay.d.ts +8 -0
  411. package/lib/types/node/ext/deplay.d.ts.map +1 -0
  412. package/lib/types/node/ext/dom-container.d.ts +12 -0
  413. package/lib/types/node/ext/dom-container.d.ts.map +1 -0
  414. package/lib/types/node/ext/interval.d.ts +9 -0
  415. package/lib/types/node/ext/interval.d.ts.map +1 -0
  416. package/lib/types/node/ext/particle.d.ts +30 -0
  417. package/lib/types/node/ext/particle.d.ts.map +1 -0
  418. package/lib/types/node/ext/rectangle.d.ts +22 -0
  419. package/lib/types/node/ext/rectangle.d.ts.map +1 -0
  420. package/lib/types/node/ext/spine.d.ts +36 -0
  421. package/lib/types/node/ext/spine.d.ts.map +1 -0
  422. package/lib/types/node/ext/sprite.d.ts +13 -0
  423. package/lib/types/node/ext/sprite.d.ts.map +1 -0
  424. package/lib/types/node/physics/physics-object.d.ts +38 -0
  425. package/lib/types/node/physics/physics-object.d.ts.map +1 -0
  426. package/lib/types/node/physics/physics-world.d.ts +18 -0
  427. package/lib/types/node/physics/physics-world.d.ts.map +1 -0
  428. package/lib/types/node/physics/rigidbodies.d.ts +23 -0
  429. package/lib/types/node/physics/rigidbodies.d.ts.map +1 -0
  430. package/lib/types/renderer/camera.d.ts +13 -0
  431. package/lib/types/renderer/camera.d.ts.map +1 -0
  432. package/lib/types/renderer/container-manager.d.ts +9 -0
  433. package/lib/types/renderer/container-manager.d.ts.map +1 -0
  434. package/lib/types/renderer/fps-display.d.ts +7 -0
  435. package/lib/types/renderer/fps-display.d.ts.map +1 -0
  436. package/lib/types/renderer/layer.d.ts +7 -0
  437. package/lib/types/renderer/layer.d.ts.map +1 -0
  438. package/lib/types/renderer/renderer.d.ts +40 -0
  439. package/lib/types/renderer/renderer.d.ts.map +1 -0
  440. package/lib/types/renderer/ticker.d.ts +6 -0
  441. package/lib/types/renderer/ticker.d.ts.map +1 -0
  442. package/lib/types/renderer/ticker.test.d.ts +40 -0
  443. package/lib/types/renderer/ticker.test.d.ts.map +1 -0
  444. package/lib/types/sprite-atlas.js +2 -0
  445. package/lib/types/sprite-atlas.js.map +1 -0
  446. package/lib/types/types/animation-atlas.d.ts +14 -0
  447. package/lib/types/types/animation-atlas.d.ts.map +1 -0
  448. package/lib/types/types/atlas copy.d.ts +12 -0
  449. package/lib/types/types/atlas copy.d.ts.map +1 -0
  450. package/lib/types/types/atlas.d.ts +16 -0
  451. package/lib/types/types/atlas.d.ts.map +1 -0
  452. package/lib/types/types/bitmap-font.d.ts +18 -0
  453. package/lib/types/types/bitmap-font.d.ts.map +1 -0
  454. package/lib/types/types/sprite-atlas.d.ts +13 -0
  455. package/lib/types/types/sprite-atlas.d.ts.map +1 -0
  456. package/lib/types/utils/device.d.ts +2 -0
  457. package/lib/types/utils/device.d.ts.map +1 -0
  458. package/lib/utils/device.js +2 -0
  459. package/lib/utils/device.js.map +1 -0
  460. package/package.json +8 -7
  461. package/src/asset/audio.ts +134 -90
  462. package/src/asset/loaders/audio.ts +23 -20
  463. package/src/asset/loaders/binary.ts +20 -16
  464. package/src/asset/loaders/bitmap-font.ts +91 -0
  465. package/src/asset/loaders/font.ts +18 -14
  466. package/src/asset/loaders/loader.ts +27 -23
  467. package/src/asset/loaders/spritesheet.ts +47 -36
  468. package/src/asset/loaders/text.ts +19 -15
  469. package/src/asset/loaders/texture.ts +30 -37
  470. package/src/asset/preload.ts +71 -64
  471. package/src/collision/check-collision.test.ts +349 -0
  472. package/src/collision/check-collision.ts +821 -0
  473. package/src/collision/colliders.ts +19 -0
  474. package/src/debug.ts +5 -0
  475. package/src/dom/dom-animated-sprite.ts +132 -0
  476. package/src/dom/dom-game-object.ts +134 -0
  477. package/src/dom/dom-particle.ts +151 -0
  478. package/src/dom/dom-preload.ts +54 -0
  479. package/src/dom/dom-sprite.ts +50 -0
  480. package/src/dom/dom-texture-loader.ts +44 -0
  481. package/src/dom/dom-utils.ts +19 -0
  482. package/src/index.ts +47 -13
  483. package/src/input/joystick.ts +316 -0
  484. package/src/node/core/dirty-number.ts +21 -0
  485. package/src/node/core/game-node.ts +74 -0
  486. package/src/node/core/game-object.ts +11 -0
  487. package/src/node/core/renderable.ts +72 -0
  488. package/src/node/core/transform.ts +82 -0
  489. package/src/node/core/transformable.ts +111 -0
  490. package/src/node/ext/animated-sprite.ts +103 -0
  491. package/src/node/ext/bitmap-text.ts +113 -0
  492. package/src/node/ext/circle.ts +55 -0
  493. package/src/node/ext/deplay.ts +25 -0
  494. package/src/node/ext/dom-container.ts +62 -0
  495. package/src/node/ext/interval.ts +25 -0
  496. package/src/node/ext/particle.ts +142 -0
  497. package/src/node/ext/rectangle.ts +71 -0
  498. package/src/node/ext/spine.ts +323 -0
  499. package/src/node/ext/sprite.ts +53 -0
  500. package/src/node/physics/physics-object.ts +127 -0
  501. package/src/node/physics/physics-world.ts +41 -0
  502. package/src/node/physics/rigidbodies.ts +14 -0
  503. package/src/renderer/camera.ts +25 -0
  504. package/src/renderer/container-manager.ts +36 -0
  505. package/src/renderer/fps-display.ts +21 -0
  506. package/src/renderer/layer.ts +15 -0
  507. package/src/renderer/renderer.ts +181 -0
  508. package/src/renderer/ticker.test.ts +325 -0
  509. package/src/renderer/ticker.ts +54 -0
  510. package/src/types/atlas.ts +17 -0
  511. package/src/types/bitmap-font.ts +19 -0
  512. package/src/utils/device.ts +1 -0
  513. package/examples/test-dom/index.ts +0 -21
  514. package/lib/game-object/game-object-physics.js +0 -188
  515. package/lib/game-object/game-object-physics.js.map +0 -1
  516. package/lib/game-object/game-object-rendering.js +0 -35
  517. package/lib/game-object/game-object-rendering.js.map +0 -1
  518. package/lib/game-object/game-object.js +0 -162
  519. package/lib/game-object/game-object.js.map +0 -1
  520. package/lib/game-object/transform.js +0 -118
  521. package/lib/game-object/transform.js.map +0 -1
  522. package/lib/game-object-ext/animated-sprite.js +0 -117
  523. package/lib/game-object-ext/animated-sprite.js.map +0 -1
  524. package/lib/game-object-ext/dom-container.js +0 -56
  525. package/lib/game-object-ext/dom-container.js.map +0 -1
  526. package/lib/game-object-ext/rect.js +0 -30
  527. package/lib/game-object-ext/rect.js.map +0 -1
  528. package/lib/game-object-ext/spine.js +0 -206
  529. package/lib/game-object-ext/spine.js.map +0 -1
  530. package/lib/game-object-ext/sprite.js +0 -46
  531. package/lib/game-object-ext/sprite.js.map +0 -1
  532. package/lib/game-object-ext/text.js +0 -68
  533. package/lib/game-object-ext/text.js.map +0 -1
  534. package/lib/game-object-ext/tiling-sprite.js +0 -64
  535. package/lib/game-object-ext/tiling-sprite.js.map +0 -1
  536. package/lib/types/game-object/game-object-physics.d.ts +0 -42
  537. package/lib/types/game-object/game-object-physics.d.ts.map +0 -1
  538. package/lib/types/game-object/game-object-rendering.d.ts +0 -15
  539. package/lib/types/game-object/game-object-rendering.d.ts.map +0 -1
  540. package/lib/types/game-object/game-object.d.ts +0 -81
  541. package/lib/types/game-object/game-object.d.ts.map +0 -1
  542. package/lib/types/game-object/transform.d.ts +0 -43
  543. package/lib/types/game-object/transform.d.ts.map +0 -1
  544. package/lib/types/game-object-ext/animated-sprite.d.ts +0 -29
  545. package/lib/types/game-object-ext/animated-sprite.d.ts.map +0 -1
  546. package/lib/types/game-object-ext/dom-container.d.ts +0 -16
  547. package/lib/types/game-object-ext/dom-container.d.ts.map +0 -1
  548. package/lib/types/game-object-ext/rect.d.ts +0 -17
  549. package/lib/types/game-object-ext/rect.d.ts.map +0 -1
  550. package/lib/types/game-object-ext/spine.d.ts +0 -35
  551. package/lib/types/game-object-ext/spine.d.ts.map +0 -1
  552. package/lib/types/game-object-ext/sprite.d.ts +0 -14
  553. package/lib/types/game-object-ext/sprite.d.ts.map +0 -1
  554. package/lib/types/game-object-ext/text.d.ts +0 -26
  555. package/lib/types/game-object-ext/text.d.ts.map +0 -1
  556. package/lib/types/game-object-ext/tiling-sprite.d.ts +0 -20
  557. package/lib/types/game-object-ext/tiling-sprite.d.ts.map +0 -1
  558. package/lib/types/utils/debug.d.ts.map +0 -1
  559. package/lib/types/utils/go.d.ts +0 -26
  560. package/lib/types/utils/go.d.ts.map +0 -1
  561. package/lib/types/world/world-debug.d.ts +0 -11
  562. package/lib/types/world/world-debug.d.ts.map +0 -1
  563. package/lib/types/world/world-physics.d.ts +0 -16
  564. package/lib/types/world/world-physics.d.ts.map +0 -1
  565. package/lib/types/world/world-rendering.d.ts +0 -28
  566. package/lib/types/world/world-rendering.d.ts.map +0 -1
  567. package/lib/types/world/world.d.ts +0 -38
  568. package/lib/types/world/world.d.ts.map +0 -1
  569. package/lib/utils/debug.js.map +0 -1
  570. package/lib/utils/go.js +0 -33
  571. package/lib/utils/go.js.map +0 -1
  572. package/lib/world/world-debug.js +0 -89
  573. package/lib/world/world-debug.js.map +0 -1
  574. package/lib/world/world-physics.js +0 -45
  575. package/lib/world/world-physics.js.map +0 -1
  576. package/lib/world/world-rendering.js +0 -123
  577. package/lib/world/world-rendering.js.map +0 -1
  578. package/lib/world/world.js +0 -147
  579. package/lib/world/world.js.map +0 -1
  580. package/src/game-object/game-object-physics.ts +0 -191
  581. package/src/game-object/game-object-rendering.ts +0 -27
  582. package/src/game-object/game-object.ts +0 -190
  583. package/src/game-object/transform.ts +0 -164
  584. package/src/game-object-ext/animated-sprite.ts +0 -140
  585. package/src/game-object-ext/dom-container.ts +0 -67
  586. package/src/game-object-ext/rect.ts +0 -40
  587. package/src/game-object-ext/spine.ts +0 -235
  588. package/src/game-object-ext/sprite.ts +0 -55
  589. package/src/game-object-ext/text.ts +0 -83
  590. package/src/game-object-ext/tiling-sprite.ts +0 -73
  591. package/src/utils/debug.ts +0 -5
  592. package/src/utils/go.ts +0 -53
  593. package/src/world/world-debug.ts +0 -114
  594. package/src/world/world-physics.ts +0 -52
  595. package/src/world/world-rendering.ts +0 -145
  596. package/src/world/world.ts +0 -171
  597. /package/examples/{test-dom → auto-battle}/index.html +0 -0
  598. /package/lib/{utils/debug.js → debug.js} +0 -0
  599. /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,127 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import Matter, { IChamferableBodyDefinition } from 'matter-js'
3
+ import { Container as PixiContainer } from 'pixi.js'
4
+ import { GameNode } from '../core/game-node'
5
+ import { isRenderableNode, RenderableNode } from '../core/renderable'
6
+ import { LocalTransform } from '../core/transform'
7
+ import { PhysicsWorld } from './physics-world'
8
+ import { Rigidbody, RigidbodyType } from './rigidbodies'
9
+
10
+ export type PhysicsObjectOptions = {
11
+ rigidbody: Rigidbody
12
+
13
+ x?: number
14
+ y?: number
15
+ rotation?: number
16
+ fixedRotation?: boolean
17
+ velocityX?: number
18
+ velocityY?: number
19
+ isStatic?: boolean
20
+
21
+ useYSort?: boolean
22
+ }
23
+
24
+ export class PhysicsObject<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {
25
+ #localTransform = new LocalTransform()
26
+ #matterBody: Matter.Body
27
+
28
+ #useYSort = false
29
+
30
+ constructor(options: PhysicsObjectOptions) {
31
+ super(new PixiContainer({ sortableChildren: true }))
32
+
33
+ const r = options.rigidbody
34
+ const x = options.x ?? 0
35
+ const y = options.y ?? 0
36
+
37
+ const bodyOptions: IChamferableBodyDefinition = {
38
+ angle: options.rotation ?? 0,
39
+ velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },
40
+ isStatic: options.isStatic ?? false
41
+ }
42
+
43
+ if (options.fixedRotation) {
44
+ bodyOptions.inertia = Infinity
45
+ bodyOptions.angularVelocity = 0
46
+ }
47
+
48
+ if (r.type === RigidbodyType.Rectangle) {
49
+ this.#matterBody = Matter.Bodies.rectangle(x, y, r.width, r.height, bodyOptions)
50
+ } else if (r.type === RigidbodyType.Circle) {
51
+ this.#matterBody = Matter.Bodies.circle(x, y, r.radius, bodyOptions)
52
+ } else if (r.type === RigidbodyType.Polygon) {
53
+ this.#matterBody = Matter.Bodies.fromVertices(x, y, [r.vertices], bodyOptions)
54
+ } else {
55
+ throw new Error('Invalid rigidbody type')
56
+ }
57
+
58
+ this.#useYSort = options.useYSort ?? false
59
+ }
60
+
61
+ protected override set parent(parent: GameNode<EventMap> | undefined) {
62
+ if (!(parent instanceof PhysicsWorld)) {
63
+ const actual = parent === undefined
64
+ ? 'undefined'
65
+ : parent.constructor?.name ?? typeof parent
66
+ throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`)
67
+ }
68
+ parent.addBody(this.#matterBody)
69
+ super.parent = parent
70
+ }
71
+
72
+ protected override get parent() {
73
+ return super.parent
74
+ }
75
+
76
+ override _updateWorldTransform() {
77
+ const mb = this.#matterBody
78
+
79
+ const pc = this._pixiContainer
80
+ pc.position.set(mb.position.x, mb.position.y)
81
+ if (this.#useYSort) pc.zIndex = mb.position.y
82
+ pc.rotation = mb.angle
83
+
84
+ const lt = this.#localTransform
85
+ lt.x = mb.position.x
86
+ lt.y = mb.position.y
87
+ lt.rotation = mb.angle
88
+
89
+ const parent = this.parent
90
+ if (parent && isRenderableNode(parent)) {
91
+ this.worldTransform.update(parent.worldTransform, this.#localTransform)
92
+ }
93
+
94
+ super._updateWorldTransform()
95
+ }
96
+
97
+ #removeFromWorld() {
98
+ (this.parent as PhysicsWorld)?.removeBody(this.#matterBody)
99
+ }
100
+
101
+ override remove() {
102
+ this.#removeFromWorld()
103
+ super.remove()
104
+ }
105
+
106
+ set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }) }
107
+ get x() { return this.#matterBody.position.x }
108
+
109
+ set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }) }
110
+ get y() { return this.#matterBody.position.y }
111
+
112
+ set rotation(v) { Matter.Body.setAngle(this.#matterBody, v) }
113
+ get rotation() { return this.#matterBody.angle }
114
+
115
+ set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }) }
116
+ get velocityX() { return this.#matterBody.velocity.x }
117
+
118
+ set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }) }
119
+ get velocityY() { return this.#matterBody.velocity.y }
120
+
121
+ set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v) }
122
+ get isStatic() { return this.#matterBody.isStatic }
123
+
124
+ disableCollisions() {
125
+ this.#removeFromWorld()
126
+ }
127
+ }
@@ -0,0 +1,41 @@
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
+ if (this.paused) return
31
+ super.update(dt)
32
+
33
+ const matterDt = dt * 1000
34
+ Matter.Engine.update(this.#matterEngine, matterDt > 16.666 ? 16.666 : matterDt)
35
+ }
36
+
37
+ override remove() {
38
+ Matter.Engine.clear(this.#matterEngine)
39
+ super.remove()
40
+ }
41
+ }
@@ -0,0 +1,14 @@
1
+ export enum RigidbodyType {
2
+ Rectangle,
3
+ Circle,
4
+ Polygon,
5
+ }
6
+
7
+ export type RectangleRigidbody = { type: RigidbodyType.Rectangle, width: number, height: number }
8
+ export type CircleRigidbody = { type: RigidbodyType.Circle, radius: number }
9
+ export type PolygonRigidbody = { type: RigidbodyType.Polygon, vertices: { x: number, y: number }[] }
10
+
11
+ export type Rigidbody =
12
+ | RectangleRigidbody
13
+ | CircleRigidbody
14
+ | PolygonRigidbody
@@ -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
+ }