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,181 @@
1
+ import { EventMap } from '@webtaku/event-emitter'
2
+ import { AutoDetectOptions, autoDetectRenderer, ColorSource, Container as PixiContainer, Renderer as PixiRenderer } from 'pixi.js'
3
+ import { debugMode } from '../debug'
4
+ import { setStyle } from '../dom/dom-utils'
5
+ import { RenderableNode } from '../node/core/renderable'
6
+ import { Camera } from './camera'
7
+ import { RendererContainerManager } from './container-manager'
8
+ import { FpsDisplay } from './fps-display'
9
+ import { Layer } from './layer'
10
+ import { Ticker } from './ticker'
11
+
12
+ export type RendererOptions = {
13
+ logicalWidth?: number
14
+ logicalHeight?: number
15
+ backgroundColor?: ColorSource
16
+ backgroundAlpha?: number
17
+ layers?: { name: string; drawOrder: number }[]
18
+ }
19
+
20
+ export class Renderer extends RenderableNode<PixiContainer, {
21
+ resize: (width: number, height: number) => void
22
+ }> {
23
+ #containerManager: RendererContainerManager
24
+ #ticker = new Ticker((dt) => this.#render(dt))
25
+ camera = new Camera()
26
+ fpsDisplay?: FpsDisplay
27
+
28
+ #logicalWidth?: number
29
+ #logicalHeight?: number
30
+ #backgroundColor?: ColorSource
31
+ #backgroundAlpha?: number
32
+
33
+ #pixiRenderer?: PixiRenderer
34
+ #layers: { [name: string]: Layer } = {}
35
+ _isSizeDirty = false
36
+
37
+ canvasWidth = 0
38
+ canvasHeight = 0
39
+ canvasLeft = 0
40
+ canvasTop = 0
41
+ viewportScale = 1
42
+ centerX = 0
43
+ centerY = 0
44
+
45
+ constructor(public container: HTMLElement, options?: RendererOptions) {
46
+ super(new PixiContainer({ sortableChildren: true }))
47
+ this.renderer = this
48
+
49
+ this.worldTransform.x.v = 0
50
+ this.worldTransform.y.v = 0
51
+ this.worldTransform.resetDirty()
52
+
53
+ this.#containerManager = new RendererContainerManager(container)
54
+ this.#containerManager.on('resize', (width, height) => this.#updateSize(width, height))
55
+
56
+ this.camera.on('positionChanged', () => this.#updatePosition())
57
+ this.camera.on('scaleChanged', () => this.#updatePosition())
58
+
59
+ if (options) {
60
+ if (options.logicalWidth !== undefined) this.#logicalWidth = options.logicalWidth
61
+ if (options.logicalHeight !== undefined) this.#logicalHeight = options.logicalHeight
62
+ if (options.backgroundColor !== undefined) this.#backgroundColor = options.backgroundColor
63
+ if (options.backgroundAlpha !== undefined) this.#backgroundAlpha = options.backgroundAlpha
64
+
65
+ if (options.layers) {
66
+ for (const layerOption of options.layers) {
67
+ const layer = new Layer(layerOption.drawOrder)
68
+ this._pixiContainer.addChild(layer._pixiContainer)
69
+ this.#layers[layerOption.name] = layer
70
+ }
71
+ }
72
+ }
73
+
74
+ if (debugMode) {
75
+ this.fpsDisplay = new FpsDisplay(container)
76
+ }
77
+
78
+ this.init()
79
+ }
80
+
81
+ private async init() {
82
+ const options: Partial<AutoDetectOptions> = {
83
+ eventMode: 'none',
84
+ resolution: window.devicePixelRatio,
85
+ }
86
+
87
+ if (this.#logicalWidth) options.width = this.#logicalWidth
88
+ if (this.#logicalHeight) options.height = this.#logicalHeight
89
+ if (this.#backgroundColor) options.backgroundColor = this.#backgroundColor
90
+ if (this.#backgroundAlpha) options.backgroundAlpha = this.#backgroundAlpha
91
+
92
+ const pr = await autoDetectRenderer(options)
93
+
94
+ setStyle(pr.canvas, {
95
+ position: 'absolute',
96
+ touchAction: 'auto',
97
+ })
98
+ this.container.appendChild(pr.canvas)
99
+
100
+ this.#pixiRenderer = pr
101
+
102
+ const cr = this.container.getBoundingClientRect()
103
+ this.#updateSize(cr.width, cr.height)
104
+ }
105
+
106
+ #updatePosition() {
107
+ const S = this.camera.scale
108
+ this._pixiContainer.scale = S
109
+ this._pixiContainer.position.set(
110
+ this.centerX - this.camera.x * S,
111
+ this.centerY - this.camera.y * S
112
+ )
113
+ }
114
+
115
+ #updateSize(containerWidth: number, containerHeight: number) {
116
+ const canvasWidth = this.#logicalWidth ?? containerWidth
117
+ const canvasHeight = this.#logicalHeight ?? containerHeight
118
+ this.canvasWidth = canvasWidth
119
+ this.canvasHeight = canvasHeight
120
+
121
+ this.centerX = canvasWidth / 2
122
+ this.centerY = canvasHeight / 2
123
+ this.#updatePosition()
124
+
125
+ const S = Math.min(containerWidth / canvasWidth, containerHeight / canvasHeight)
126
+ this.viewportScale = S
127
+
128
+ const displayWidth = canvasWidth * S
129
+ const displayHeight = canvasHeight * S
130
+
131
+ const canvasLeft = (containerWidth - displayWidth) / 2
132
+ const canvasTop = (containerHeight - displayHeight) / 2
133
+ this.canvasLeft = canvasLeft
134
+ this.canvasTop = canvasTop
135
+
136
+ if (this.#pixiRenderer) {
137
+ this.#pixiRenderer.resize(canvasWidth, canvasHeight)
138
+
139
+ setStyle(this.#pixiRenderer.canvas, {
140
+ width: `${displayWidth}px`,
141
+ height: `${displayHeight}px`,
142
+ left: `${canvasLeft}px`,
143
+ top: `${canvasTop}px`,
144
+ })
145
+
146
+ this.emit('resize', canvasWidth, canvasHeight)
147
+ }
148
+
149
+ this._isSizeDirty = true
150
+ }
151
+
152
+ #render(dt: number) {
153
+ this.update(dt) // 로직 업데이트
154
+ this._updateWorldTransform()
155
+ this._resetWorldTransformDirty()
156
+ this.#pixiRenderer?.render(this._pixiContainer)
157
+ this.fpsDisplay?.update()
158
+
159
+ this._isSizeDirty = false
160
+ }
161
+
162
+ _addToLayer(node: RenderableNode<PixiContainer, EventMap>, layerName: string) {
163
+ const layer = this.#layers[layerName]
164
+ if (!layer) throw new Error(`Layer ${layerName} does not exist.`)
165
+ layer._pixiContainer.addChild(node._pixiContainer)
166
+ }
167
+
168
+ override remove() {
169
+ this.#containerManager.remove()
170
+ this.#ticker.remove()
171
+ this.#pixiRenderer?.destroy()
172
+ this.fpsDisplay?.remove()
173
+ super.remove()
174
+ }
175
+
176
+ screenToWorld(screenX: number, screenY: number) {
177
+ const x = (screenX - this.canvasLeft) / this.viewportScale - this.canvasWidth / 2
178
+ const y = (screenY - this.canvasTop) / this.viewportScale - this.canvasHeight / 2
179
+ return { x, y }
180
+ }
181
+ }
@@ -0,0 +1,325 @@
1
+ /** @jest-environment jsdom */
2
+
3
+ /**
4
+ * Test Suite — Ticker (Jest)
5
+ * -------------------------------------------------------
6
+ * Goals
7
+ * - Avoid floating-point pitfalls around fixed step boundaries
8
+ * - Validate uncapped, capped via blur (6fps), long frame split,
9
+ * focus/pageshow transitions, and remove()
10
+ * - In this implementation: no setFixedFps; debugMode + focus/blur/pageshow control fps cap
11
+ *
12
+ * Principles
13
+ * - Do not assert exactly at the boundary (e.g., prefer 170ms over ~166ms)
14
+ * - Validate deltaTime using toBeCloseTo + loose call count checks
15
+ */
16
+
17
+ /** ----------------------- Time & RAF harness ----------------------- **/
18
+
19
+ // Local callback type to avoid depending on DOM lib typings.
20
+ type FrameCb = (time: number) => void
21
+
22
+ // Simulated monotonic clock (ms)
23
+ let nowMs = 0
24
+
25
+ // RAF callback registry: id -> cb
26
+ const rafCallbacks = new Map<number, FrameCb>()
27
+ let nextRafId = 1
28
+
29
+ const installTimeAndRafMocks = () => {
30
+ jest.spyOn(performance, 'now').mockImplementation(() => nowMs)
31
+
32
+ jest
33
+ .spyOn(window, 'requestAnimationFrame')
34
+ .mockImplementation((cb: FrameCb) => {
35
+ const id = nextRafId++
36
+ rafCallbacks.set(id, cb)
37
+ return id as unknown as number
38
+ })
39
+
40
+ jest.spyOn(window, 'cancelAnimationFrame').mockImplementation((id: number) => {
41
+ rafCallbacks.delete(id)
42
+ })
43
+ }
44
+
45
+ const resetHarness = () => {
46
+ nowMs = 0
47
+ rafCallbacks.clear()
48
+ nextRafId = 1
49
+ }
50
+
51
+ /**
52
+ * Advance a single frame: move the clock by advanceMs and
53
+ * run only the currently registered RAF callbacks
54
+ * (callbacks registered during this step run on the next step).
55
+ */
56
+ const step = (advanceMs: number) => {
57
+ nowMs += advanceMs
58
+ const cbs = [...rafCallbacks.values()]
59
+ rafCallbacks.clear()
60
+ for (const cb of cbs) cb(nowMs)
61
+ }
62
+
63
+ /** Advance multiple frames (helper) */
64
+ const advance = (totalMs: number, stepMs = 16) => {
65
+ const n = Math.floor(totalMs / stepMs)
66
+ for (let i = 0; i < n; i++) step(stepMs)
67
+ const remain = totalMs - n * stepMs
68
+ if (remain > 0) step(remain)
69
+ }
70
+
71
+ /**
72
+ * Helper to (re)load Ticker with a specific debugMode value.
73
+ * Uses jest.resetModules + jest.doMock to inject the desired export.
74
+ */
75
+ const loadTickerWithDebug = async (debug: boolean) => {
76
+ jest.resetModules()
77
+ jest.doMock('../debug', () => ({ debugMode: debug }), { virtual: true })
78
+ const mod = await import('./ticker')
79
+ return (mod as any).Ticker as new (onTick: (dt: number) => void) => { remove(): void }
80
+ }
81
+
82
+ /** Small helpers to read arguments cleanly */
83
+ const argOf = (mockFn: jest.Mock, nthZeroBased: number) => mockFn.mock.calls[nthZeroBased][0] as number
84
+ const lastArg = (mockFn: jest.Mock) => {
85
+ const i = mockFn.mock.calls.length - 1
86
+ return mockFn.mock.calls[i][0] as number
87
+ }
88
+
89
+ /** ----------------------- Lifecycle -------------------------- **/
90
+
91
+ beforeEach(() => {
92
+ resetHarness()
93
+ jest.restoreAllMocks()
94
+ installTimeAndRafMocks()
95
+ })
96
+
97
+ afterEach(() => {
98
+ jest.restoreAllMocks()
99
+ resetHarness()
100
+ })
101
+
102
+ /** ----------------------- Tests ------------------------------ **/
103
+
104
+ describe('uncapped mode (debugMode=false)', () => {
105
+ it('calls onTick once per frame with raw deltaTime (seconds)', async () => {
106
+ const Ticker = await loadTickerWithDebug(false)
107
+ const spy = jest.fn()
108
+ const ticker = new Ticker(spy) // default: uncapped
109
+
110
+ step(10) // 0.010
111
+ step(20) // 0.020
112
+ step(30) // 0.030
113
+
114
+ expect(spy).toHaveBeenCalledTimes(3)
115
+
116
+ // Assert shapes, then values
117
+ expect(spy).toHaveBeenNthCalledWith(1, expect.any(Number))
118
+ expect(spy).toHaveBeenNthCalledWith(2, expect.any(Number))
119
+ expect(spy).toHaveBeenNthCalledWith(3, expect.any(Number))
120
+
121
+ expect(argOf(spy, 0)).toBeCloseTo(0.010, 6)
122
+ expect(argOf(spy, 1)).toBeCloseTo(0.020, 6)
123
+ expect(argOf(spy, 2)).toBeCloseTo(0.030, 6)
124
+
125
+ ticker.remove()
126
+ })
127
+
128
+ it('does not call onTick when deltaTime <= 0', async () => {
129
+ const Ticker = await loadTickerWithDebug(false)
130
+ const spy = jest.fn()
131
+ const ticker = new Ticker(spy)
132
+
133
+ step(0)
134
+ expect(spy).not.toHaveBeenCalled()
135
+
136
+ step(5)
137
+ expect(spy).toHaveBeenCalledTimes(1)
138
+ expect(spy).toHaveBeenLastCalledWith(expect.any(Number))
139
+ expect(lastArg(spy)).toBeCloseTo(0.005, 6)
140
+
141
+ ticker.remove()
142
+ })
143
+ })
144
+
145
+ describe('capped mode via blur (debugMode=true -> 6fps)', () => {
146
+ it('accumulates lag and calls at fixed-step boundaries (avoid exact boundary)', async () => {
147
+ const Ticker = await loadTickerWithDebug(true)
148
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
149
+
150
+ const spy = jest.fn()
151
+ const ticker = new Ticker(spy)
152
+
153
+ // Apply 6fps cap using blur (fixedStep ≈ 1/6 ≈ 0.1666667s)
154
+ window.dispatchEvent(new Event('blur'))
155
+
156
+ // 100 + 70 = 170ms -> crosses one boundary -> one call ≈ fixedStep
157
+ step(100)
158
+ step(70)
159
+ expect(spy).toHaveBeenCalledTimes(1)
160
+ expect(spy).toHaveBeenLastCalledWith(expect.any(Number))
161
+ expect(lastArg(spy)).toBeCloseTo(1 / 6, 6)
162
+
163
+ // Remaining lag ≈ 0.0033s
164
+ step(91) // still below another boundary
165
+ expect(spy).toHaveBeenCalledTimes(1)
166
+ step(80) // crosses again
167
+ expect(spy).toHaveBeenCalledTimes(2)
168
+ expect(spy).toHaveBeenLastCalledWith(expect.any(Number))
169
+ expect(lastArg(spy)).toBeCloseTo(1 / 6, 6)
170
+
171
+ ticker.remove()
172
+ })
173
+
174
+ it('long frame (delta >= 2*fixedStep) triggers two calls: fixedStep then raw delta; then lag resets', async () => {
175
+ const Ticker = await loadTickerWithDebug(true)
176
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
177
+
178
+ const spy = jest.fn()
179
+ const ticker = new Ticker(spy)
180
+
181
+ window.dispatchEvent(new Event('blur')) // enable 6fps cap
182
+
183
+ // 500ms (0.5s) >= 2 * (1/6 ≈ 0.3333s)
184
+ step(500)
185
+ expect(spy).toHaveBeenCalledTimes(2)
186
+
187
+ expect(spy).toHaveBeenNthCalledWith(1, expect.any(Number))
188
+ expect(argOf(spy, 0)).toBeCloseTo(1 / 6, 6)
189
+
190
+ expect(spy).toHaveBeenNthCalledWith(2, expect.any(Number))
191
+ expect(argOf(spy, 1)).toBeCloseTo(0.5, 6)
192
+
193
+ // Repeat pattern
194
+ step(500)
195
+ expect(spy).toHaveBeenCalledTimes(4)
196
+
197
+ expect(spy).toHaveBeenNthCalledWith(3, expect.any(Number))
198
+ expect(argOf(spy, 2)).toBeCloseTo(1 / 6, 6)
199
+
200
+ expect(spy).toHaveBeenNthCalledWith(4, expect.any(Number))
201
+ expect(argOf(spy, 3)).toBeCloseTo(0.5, 6)
202
+
203
+ ticker.remove()
204
+ })
205
+ })
206
+
207
+ describe('runtime transitions via focus/pageshow (debugMode=true)', () => {
208
+ it('blur -> capped(6fps) / focus -> uncapped: after focus, raw delta behavior resumes', async () => {
209
+ const Ticker = await loadTickerWithDebug(true)
210
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
211
+
212
+ const spy = jest.fn()
213
+ const ticker = new Ticker(spy)
214
+
215
+ // Enter capped mode and get one fixed-step call
216
+ window.dispatchEvent(new Event('blur'))
217
+ step(170)
218
+ expect(spy).toHaveBeenCalledTimes(1)
219
+ expect(spy).toHaveBeenLastCalledWith(expect.any(Number))
220
+ expect(lastArg(spy)).toBeCloseTo(1 / 6, 6)
221
+
222
+ // Back to uncapped
223
+ window.dispatchEvent(new Event('focus'))
224
+
225
+ spy.mockClear()
226
+ step(16)
227
+ step(33)
228
+ expect(spy).toHaveBeenCalledTimes(2)
229
+
230
+ expect(spy).toHaveBeenNthCalledWith(1, expect.any(Number))
231
+ expect(argOf(spy, 0)).toBeCloseTo(0.016, 6)
232
+
233
+ expect(spy).toHaveBeenNthCalledWith(2, expect.any(Number))
234
+ expect(argOf(spy, 1)).toBeCloseTo(0.033, 6)
235
+
236
+ ticker.remove()
237
+ })
238
+
239
+ it('pageshow(persisted=true) sets fpsCap to uncapped again', async () => {
240
+ const Ticker = await loadTickerWithDebug(true)
241
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
242
+
243
+ const spy = jest.fn()
244
+ const ticker = new Ticker(spy)
245
+
246
+ window.dispatchEvent(new Event('blur'))
247
+ step(200) // > 1/6s => fixed-step call
248
+ expect(spy).toHaveBeenCalledTimes(1)
249
+ expect(spy).toHaveBeenLastCalledWith(expect.any(Number))
250
+ expect(lastArg(spy)).toBeCloseTo(1 / 6, 6)
251
+
252
+ // Create a pageshow event with persisted=true (jsdom lacks PageTransitionEvent)
253
+ const evt = new Event('pageshow') as Event & { persisted?: boolean }
254
+ Object.defineProperty(evt, 'persisted', { value: true })
255
+ window.dispatchEvent(evt)
256
+
257
+ spy.mockClear()
258
+ step(25)
259
+ step(40)
260
+ expect(spy).toHaveBeenCalledTimes(2)
261
+
262
+ expect(spy).toHaveBeenNthCalledWith(1, expect.any(Number))
263
+ expect(argOf(spy, 0)).toBeCloseTo(0.025, 6)
264
+
265
+ expect(spy).toHaveBeenNthCalledWith(2, expect.any(Number))
266
+ expect(argOf(spy, 1)).toBeCloseTo(0.040, 6)
267
+
268
+ ticker.remove()
269
+ })
270
+ })
271
+
272
+ describe('remove()', () => {
273
+ it('cancels next RAF and stops future ticks; also cleans up listeners', async () => {
274
+ const Ticker = await loadTickerWithDebug(true)
275
+
276
+ // Ensure the ticker starts in uncapped mode so the first small step triggers a tick.
277
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
278
+
279
+ const spy = jest.fn()
280
+ const cancelSpy = jest.spyOn(window, 'cancelAnimationFrame')
281
+
282
+ const ticker = new Ticker(spy)
283
+
284
+ step(16) // ~0.016s -> should tick in uncapped mode
285
+ expect(spy).toHaveBeenCalledTimes(1)
286
+
287
+ ticker.remove()
288
+ expect(cancelSpy).toHaveBeenCalled()
289
+
290
+ spy.mockClear()
291
+ advance(200, 16)
292
+ expect(spy).not.toHaveBeenCalled()
293
+
294
+ // Listeners are cleaned up (dispatching events does nothing and does not throw)
295
+ expect(() => window.dispatchEvent(new Event('blur'))).not.toThrow()
296
+ expect(() => window.dispatchEvent(new Event('focus'))).not.toThrow()
297
+ })
298
+ })
299
+
300
+ describe('long-running sanity (ragged frames, capped=6fps)', () => {
301
+ it('produces a reasonable number of calls; includes fixedStep calls', async () => {
302
+ const Ticker = await loadTickerWithDebug(true)
303
+ jest.spyOn(document, 'hasFocus').mockReturnValue(true)
304
+
305
+ const spy = jest.fn()
306
+ const ticker = new Ticker(spy)
307
+
308
+ window.dispatchEvent(new Event('blur')) // 6fps -> fixedStep ≈ 0.1667
309
+
310
+ // Total ~1000ms with some long frames to trigger the split branch
311
+ const frames = [33, 33, 35, 201, 51, 61, 41, 201, 201, 251]
312
+ for (const ms of frames) step(ms)
313
+
314
+ const calls = spy.mock.calls.length
315
+ // With lag resets/rounding, tolerate a loose range
316
+ expect(calls).toBeGreaterThanOrEqual(5)
317
+ expect(calls).toBeLessThanOrEqual(9)
318
+
319
+ // At least one call should be exactly the fixed step (~1/6)
320
+ const hasFixedStep = spy.mock.calls.some(([dt]) => Math.abs((dt as number) - 1 / 6) < 1e-6)
321
+ expect(hasFixedStep).toBe(true)
322
+
323
+ ticker.remove()
324
+ })
325
+ })
@@ -0,0 +1,54 @@
1
+ import { debugMode } from '../debug'
2
+
3
+ export class Ticker {
4
+ #fpsCap?: number
5
+ #frameId = 0
6
+
7
+ constructor(onTick: (dt: number) => void) {
8
+ let prevTime = 0
9
+ let lagSeconds = 0
10
+
11
+ const step = (timestamp: number) => {
12
+ const dt = (timestamp - prevTime) / 1000
13
+ if (dt > 0) {
14
+ const fpsCap = this.#fpsCap
15
+ if (fpsCap !== undefined && fpsCap > 0) {
16
+ lagSeconds += dt
17
+ const fixedStep = 1 / fpsCap
18
+ if (lagSeconds >= fixedStep) {
19
+ onTick(fixedStep)
20
+ if (lagSeconds >= fixedStep * 2) { onTick(dt); lagSeconds = 0 }
21
+ else { lagSeconds -= fixedStep }
22
+ }
23
+ } else {
24
+ onTick(dt)
25
+ }
26
+ prevTime = timestamp
27
+ }
28
+ this.#frameId = requestAnimationFrame(step)
29
+ }
30
+ this.#frameId = requestAnimationFrame(step)
31
+
32
+ if (debugMode) {
33
+ if (!document.hasFocus()) this.#fpsCap = 6
34
+ window.addEventListener('blur', this.#blurListener)
35
+ window.addEventListener('focus', this.#focusListener)
36
+ window.addEventListener('pageshow', this.#pageshowListener)
37
+ }
38
+ }
39
+
40
+ #blurListener = () => { this.#fpsCap = 6 }
41
+ #focusListener = () => { this.#fpsCap = undefined }
42
+ #pageshowListener = (event: PageTransitionEvent) => {
43
+ if (event.persisted) {
44
+ this.#fpsCap = undefined
45
+ }
46
+ }
47
+
48
+ remove() {
49
+ cancelAnimationFrame(this.#frameId)
50
+ window.removeEventListener('blur', this.#blurListener)
51
+ window.removeEventListener('focus', this.#focusListener)
52
+ window.removeEventListener('pageshow', this.#pageshowListener)
53
+ }
54
+ }
@@ -0,0 +1,17 @@
1
+ export interface Frame {
2
+ x: number
3
+ y: number
4
+ w: number
5
+ h: number
6
+ }
7
+
8
+ export type Animation = {
9
+ frames: string[],
10
+ fps: number,
11
+ loop: boolean
12
+ }
13
+
14
+ export type Atlas = {
15
+ frames: Record<string, Frame>
16
+ animations: Record<string, Animation>
17
+ }
@@ -0,0 +1,19 @@
1
+ import { Texture } from 'pixi.js'
2
+
3
+ export type Char = {
4
+ x: number
5
+ y: number
6
+ width: number
7
+ height: number
8
+ xoffset: number
9
+ yoffset: number
10
+ xadvance: number
11
+ }
12
+
13
+ export type BitmapFont = {
14
+ src: string
15
+ chars: Record<number, Char>
16
+ texture: Texture
17
+ size: number
18
+ lineHeight: number
19
+ }
@@ -0,0 +1 @@
1
+ export const isMobile = /Android|iPhone|iPad|iPod/i.test(navigator.userAgent)
@@ -1,21 +0,0 @@
1
- import { enableDebug, World, DomContainerObject } from '../../src';
2
-
3
- enableDebug();
4
-
5
- const world = new World({ width: 800, height: 600 });
6
- world.container.style.width = '100%';
7
- world.container.style.height = '100%';
8
- document.body.appendChild(world.container);
9
-
10
- const testEl = document.createElement('div');
11
- testEl.textContent = 'Hello World';
12
- testEl.style.color = 'red';
13
- testEl.onclick = () => alert('click');
14
-
15
- const go = new DomContainerObject({ el: testEl });
16
- go.alpha = 0.5;
17
- world.add(go);
18
-
19
- world.on('update', (dt) => {
20
- go.rotation += dt;
21
- });