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,213 @@
1
+ import {
2
+ AnimatedSpriteNode,
3
+ ColliderType,
4
+ DelayNode,
5
+ GameObjectOptions,
6
+ RigidbodyType,
7
+ sfxPlayer,
8
+ } from '../../../src/index'
9
+ import orcAtlas from '../assets/spritesheets/orc-atlas.json'
10
+ import { Character } from './character'
11
+
12
+ const ORC_MOVE_SPEED = 3 as const // 엔진이 dt(초)를 주면 아래 step 계산 주석 참고
13
+ const ORC_HITBOX_X = 24 as const
14
+ const ORC_ATTACK_DAMAGE = 1 as const
15
+ const EPS = 1e-3 // 스냅/오버슈트 방지용
16
+ const EPS2 = EPS * EPS
17
+
18
+ export class Orc extends Character<{
19
+ hit: (damage: number) => void
20
+ dead: () => void
21
+ }> {
22
+ protected _sprite: AnimatedSpriteNode
23
+
24
+ // ── 타겟/방향(정규화) ─────────────────────────────────────────────
25
+ #tx: number | null = null
26
+ #ty: number | null = null
27
+ #dirX = 0
28
+ #dirY = 0
29
+ #moveSpeed = ORC_MOVE_SPEED
30
+
31
+ // ── 상태 ─────────────────────────────────────────────────────────
32
+ #attacking = false
33
+
34
+ constructor(options?: GameObjectOptions) {
35
+ super({
36
+ ...options,
37
+ maxHp: 100,
38
+ hp: 100,
39
+ rigidbody: { type: RigidbodyType.Rectangle, width: 30, height: 30 },
40
+ hitbox: { type: ColliderType.Rectangle, width: 32, height: 52, x: ORC_HITBOX_X, y: -8 },
41
+ hurtbox: { type: ColliderType.Rectangle, width: 24, height: 32, x: 0, y: 0 },
42
+ })
43
+
44
+ this._sprite = new AnimatedSpriteNode({
45
+ src: 'assets/spritesheets/orc.png',
46
+ atlas: orcAtlas,
47
+ animation: 'idle',
48
+ scale: 2,
49
+ })
50
+
51
+ this._sprite.on('animationend', (animation: string) => {
52
+ if (animation.startsWith('attack')) {
53
+ this.#attacking = false
54
+ // 이동 중이면 walk, 아니면 idle (중복 전환 방지)
55
+ if (this.#isMoving()) this.#setWalk()
56
+ else this.#setIdle()
57
+ } else if (animation === 'die') {
58
+ this.emit('dead')
59
+ }
60
+ })
61
+
62
+ this.add(this._sprite)
63
+ }
64
+
65
+ // ── 외부 인터페이스 ──────────────────────────────────────────────
66
+ moveTo(x: number, y: number) {
67
+ if (this.dead) return
68
+ this.#tx = x
69
+ this.#ty = y
70
+
71
+ // 방향 벡터 미리 정규화(삼각함수 없음)
72
+ const dx = x - this.x
73
+ const dy = y - this.y
74
+ const len2 = dx * dx + dy * dy
75
+ if (len2 > EPS2) {
76
+ // 역길이 계산(정확 sqrt 대신 1/sqrt 사용; JS에 fast invsqrt 없음)
77
+ const invLen = 1 / Math.sqrt(len2)
78
+ this.#dirX = dx * invLen
79
+ this.#dirY = dy * invLen
80
+ } else {
81
+ this.#dirX = 0
82
+ this.#dirY = 0
83
+ }
84
+
85
+ // 좌우 플립/히트박스 오프셋(부호만 필요)
86
+ const scale = Math.abs(this._sprite.scaleX)
87
+ this._sprite.scaleX = dx >= 0 ? scale : -scale
88
+ this.hitboxX = dx >= 0 ? ORC_HITBOX_X : -ORC_HITBOX_X
89
+
90
+ if (!this.#attacking) this.#setWalk()
91
+ }
92
+
93
+ stop() {
94
+ this.#tx = null
95
+ this.#ty = null
96
+ this.#dirX = 0
97
+ this.#dirY = 0
98
+ if (!this.#attacking && !this.dead) this.#setIdle()
99
+ }
100
+
101
+ attack() {
102
+ if (this.dead || this.#attacking) return
103
+ this.#attacking = true
104
+ // 이동 즉시 정지(불필요한 계산 차단)
105
+ this.#tx = null
106
+ this.#ty = null
107
+ this.#dirX = 0
108
+ this.#dirY = 0
109
+
110
+ // 랜덤 공격 모션(애니메이션 변경 최소)
111
+ const nextAnim = (Math.random() < 0.5) ? 'attack1' : 'attack2'
112
+ if (this._sprite.animation !== nextAnim) {
113
+ this._sprite.animation = nextAnim
114
+ }
115
+
116
+ // 타격 타이밍
117
+ this.add(new DelayNode(0.3, () => this.emit('hit', ORC_ATTACK_DAMAGE)))
118
+
119
+ // SFX (대량 동시 재생은 믹서에서 한정/풀링 권장)
120
+ sfxPlayer.playRandom(
121
+ 'assets/sfx/orc/miss/miss1.wav',
122
+ 'assets/sfx/orc/miss/miss2.wav',
123
+ 'assets/sfx/orc/miss/miss3.wav'
124
+ )
125
+ }
126
+
127
+ // ── 루프 ─────────────────────────────────────────────────────────
128
+ protected override update(dt: number) {
129
+ if (this.paused) return
130
+ super.update(dt)
131
+
132
+ if (this.dead || this.#attacking) return
133
+ if (this.#tx === null || this.#ty === null) return
134
+
135
+ // 남은 거리 제곱(정확 sqrt 불필요)
136
+ const rx = this.#tx - this.x
137
+ const ry = this.#ty - this.y
138
+ const remaining2 = rx * rx + ry * ry
139
+ if (remaining2 <= EPS2) {
140
+ // 도착 처리
141
+ this.x = this.#tx
142
+ this.y = this.#ty
143
+ this.stop()
144
+ return
145
+ }
146
+
147
+ // 한 프레임 이동량(step)
148
+ const step = this.#moveSpeed * (dt > 0 ? dt * 60 : 1) // 프레임 기준 정규화
149
+
150
+ // 오버슈트 방지: step^2와 remaining^2 비교
151
+ const step2 = step * step
152
+ if (remaining2 <= step2) {
153
+ this.x = this.#tx
154
+ this.y = this.#ty
155
+ this.stop()
156
+ return
157
+ }
158
+
159
+ // 미리 정규화해둔 방향으로 이동(삼각함수 없음)
160
+ this.x += this.#dirX * step
161
+ this.y += this.#dirY * step
162
+
163
+ // 진행 방향에 따른 좌우 플립/히트박스 (dirX 부호만 사용)
164
+ const scale = Math.abs(this._sprite.scaleX)
165
+ const dirX = this.#dirX
166
+ if (dirX > 0) {
167
+ if (this._sprite.scaleX < 0) this._sprite.scaleX = scale
168
+ if (this.hitboxX !== ORC_HITBOX_X) this.hitboxX = ORC_HITBOX_X
169
+ } else if (dirX < 0) {
170
+ if (this._sprite.scaleX > 0) this._sprite.scaleX = -scale
171
+ if (this.hitboxX !== -ORC_HITBOX_X) this.hitboxX = -ORC_HITBOX_X
172
+ }
173
+
174
+ // 이동 중 애니메이션 보장(중복 전환 방지)
175
+ if (this._sprite.animation !== 'walk') this.#setWalk()
176
+ }
177
+
178
+ // ── 피격/사망 ────────────────────────────────────────────────────
179
+ override takeDamage(damage: number) {
180
+ super.takeDamage(damage)
181
+ sfxPlayer.playRandom(
182
+ 'assets/sfx/orc/hit/hit1.wav',
183
+ 'assets/sfx/orc/hit/hit2.wav',
184
+ 'assets/sfx/orc/hit/hit3.wav'
185
+ )
186
+ }
187
+
188
+ protected override onDie() {
189
+ this.#tx = null
190
+ this.#ty = null
191
+ this.#dirX = 0
192
+ this.#dirY = 0
193
+ if (this._sprite.animation !== 'die') {
194
+ this._sprite.animation = 'die'
195
+ }
196
+ sfxPlayer.play('assets/sfx/orc/die/die.wav')
197
+ }
198
+
199
+ // ── 내부 유틸 ────────────────────────────────────────────────────
200
+ #isMoving() {
201
+ return this.#tx !== null && this.#ty !== null
202
+ }
203
+ #setWalk() {
204
+ if (this._sprite.animation !== 'walk') {
205
+ this._sprite.animation = 'walk'
206
+ }
207
+ }
208
+ #setIdle() {
209
+ if (this._sprite.animation !== 'idle') {
210
+ this._sprite.animation = 'idle'
211
+ }
212
+ }
213
+ }
@@ -0,0 +1,27 @@
1
+ import { AnimatedSpriteNode, CircleCollider, CircleNode, ColliderType, debugMode, GameObject, GameObjectOptions } from '../../../src'
2
+ import potionAtlas from '../assets/spritesheets/potion-atlas.json'
3
+
4
+ export type PotionOptions = {
5
+ healAmount?: number
6
+ } & GameObjectOptions
7
+
8
+ export class Potion extends GameObject {
9
+ triggerCollider: CircleCollider = { type: ColliderType.Circle, radius: 16 }
10
+ healAmount: number
11
+
12
+ constructor(options?: PotionOptions) {
13
+ super({ ...options, useYSort: true })
14
+ this.healAmount = options?.healAmount ?? 100
15
+
16
+ this.add(new AnimatedSpriteNode({
17
+ src: 'assets/spritesheets/potion.png',
18
+ atlas: potionAtlas,
19
+ animation: 'animation',
20
+ scale: 2
21
+ }))
22
+
23
+ if (debugMode) {
24
+ this.add(new CircleNode({ ...this.triggerCollider, stroke: 'green', alpha: 0.5, layer: 'hud' }))
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,178 @@
1
+ import { checkCollision, GameObject, IntervalNode, isMobile, Joystick, musicPlayer } from '../../src'
2
+ import { Hero } from './objects/hero'
3
+ import { Orc } from './objects/orc'
4
+ import { Potion } from './objects/potion'
5
+
6
+ function createTextElement() {
7
+ const el = document.createElement('div')
8
+ el.style.color = 'white'
9
+ el.style.position = 'absolute'
10
+ el.style.top = '10px'
11
+ el.style.zIndex = '1'
12
+ return el
13
+ }
14
+
15
+ const SCORE_PER_ORC = 100
16
+
17
+ export class Stage extends GameObject {
18
+ #hero = new Hero();
19
+ #orcs: Set<Orc> = new Set();
20
+ #potions: Set<Potion> = new Set();
21
+
22
+ #time = 0
23
+ #score = 0
24
+ #isGameOver = false
25
+
26
+ #timeText: HTMLDivElement
27
+ #hpText: HTMLDivElement
28
+ #scoreText: HTMLDivElement
29
+
30
+ #spawnOrcInterval: IntervalNode
31
+ #spawnPotionInterval: IntervalNode
32
+
33
+ constructor() {
34
+ super()
35
+ musicPlayer.play('assets/bgm/battle.mp3')
36
+
37
+ this.add(this.#hero)
38
+ this.add(this.#spawnOrcInterval = new IntervalNode(1, () => this.#spawnOrc()))
39
+ this.add(this.#spawnPotionInterval = new IntervalNode(3, () => this.#spawnPotion()))
40
+
41
+ for (let i = 0; i < 1000; i++) {
42
+ this.#spawnOrc()
43
+ }
44
+
45
+ const joystickImage = new Image()
46
+ joystickImage.src = 'assets/joystick/joystick.png'
47
+
48
+ const knobImage = new Image()
49
+ knobImage.src = 'assets/joystick/knob.png'
50
+
51
+ this.add(
52
+ new Joystick({
53
+ onMove: (r, d) => this.#hero.move(r, d),
54
+ onRelease: () => this.#hero.stop(),
55
+ onKeyDown: (code) => {
56
+ if (code === 'KeyA') this.#hero.attack()
57
+ },
58
+ joystickImage,
59
+ knobImage,
60
+ maxKnobDistance: 70,
61
+ }),
62
+ )
63
+
64
+ this.#timeText = createTextElement()
65
+ this.#hpText = createTextElement()
66
+ this.#scoreText = createTextElement()
67
+
68
+ this.#timeText.textContent = `Time: ${this.#time}`
69
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
70
+ this.#scoreText.textContent = `Score: ${this.#score}`
71
+
72
+ this.#timeText.style.left = '10px'
73
+ this.#hpText.style.left = '50%'
74
+ this.#hpText.style.transform = 'translate(-50%, 0)'
75
+ this.#scoreText.style.right = '10px'
76
+
77
+ this.#hero.on('hit', (damage) => {
78
+ for (const o of this.#orcs) {
79
+ if (checkCollision(this.#hero.hitbox, this.#hero.worldTransform, o.hurtbox, o.worldTransform)) {
80
+ o.takeDamage(damage)
81
+ }
82
+ }
83
+ })
84
+
85
+ this.#hero.on('changeHp', () => {
86
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
87
+ })
88
+
89
+ this.#hero.on('dead', () => {
90
+ this.#gameOver()
91
+ })
92
+ }
93
+
94
+ #gameOver() {
95
+ this.#isGameOver = true
96
+ this.#spawnOrcInterval.remove()
97
+ this.#spawnPotionInterval.remove()
98
+ for (const o of this.#orcs) {
99
+ o.stop()
100
+ }
101
+
102
+ const gameOverText = createTextElement()
103
+ gameOverText.textContent = 'Game Over'
104
+ gameOverText.style.left = '50%'
105
+ gameOverText.style.top = '50%'
106
+ gameOverText.style.transform = 'translate(-50%, -50%)'
107
+ this.renderer?.container.append(gameOverText)
108
+ }
109
+
110
+ protected override set renderer(renderer) {
111
+ super.renderer = renderer
112
+
113
+ if (renderer) {
114
+ const c = renderer.container
115
+ c.append(this.#timeText, this.#hpText, this.#scoreText)
116
+ }
117
+ }
118
+
119
+ protected override get renderer() {
120
+ return super.renderer
121
+ }
122
+
123
+ #spawnOrc() {
124
+ const o = new Orc()
125
+ o.x = Math.random() * 800 - 400
126
+ o.y = Math.random() * 600 - 300
127
+ o.on('hit', (damage) => {
128
+ if (checkCollision(this.#hero.hurtbox, this.#hero.worldTransform, o.hitbox, o.worldTransform)) {
129
+ this.#hero.takeDamage(damage)
130
+ }
131
+ })
132
+ this.add(o)
133
+ this.#orcs.add(o)
134
+ o.on('dead', () => {
135
+ this.#orcs.delete(o)
136
+ this.#score += SCORE_PER_ORC
137
+ this.#scoreText.textContent = `Score: ${this.#score}`
138
+ })
139
+ }
140
+
141
+ #spawnPotion() {
142
+ const p = new Potion()
143
+ p.x = Math.random() * 800 - 400
144
+ p.y = Math.random() * 600 - 300
145
+ this.add(p)
146
+ this.#potions.add(p)
147
+ p.on('remove', () => this.#potions.delete(p))
148
+ }
149
+
150
+ protected override update(dt: number) {
151
+ if (this.paused) return
152
+ super.update(dt)
153
+
154
+ if (this.#isGameOver) return
155
+
156
+ const h = this.#hero
157
+ if (h.dead) return
158
+
159
+ for (const o of this.#orcs) {
160
+ if (checkCollision(h.hurtbox, h.worldTransform, o.hitbox, o.worldTransform)) {
161
+ o.attack()
162
+ } else {
163
+ o.moveTo(this.#hero.x, this.#hero.y)
164
+ }
165
+
166
+ if (isMobile && checkCollision(h.hitbox, h.worldTransform, o.hurtbox, o.worldTransform)) {
167
+ h.attack()
168
+ }
169
+ }
170
+
171
+ for (const p of this.#potions) {
172
+ if (checkCollision(h.hitbox, h.worldTransform, p.triggerCollider, p.worldTransform)) {
173
+ h.heal(p.healAmount)
174
+ p.remove()
175
+ }
176
+ }
177
+ }
178
+ }
@@ -0,0 +1,107 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--Created using Glyph Designer - http://71squared.com/glyphdesigner-->
3
+ <font>
4
+ <info face="Peaberry" size="16" bold="0" italic="0" charset="" unicode="0" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="2,2"/>
5
+ <common lineHeight="25" base="13" scaleW="215" scaleH="245" pages="1" packed="0"/>
6
+ <pages>
7
+ <page id="0" file="WhitePeaberry.png"/>
8
+ </pages>
9
+ <chars count="95">
10
+ <char id="32" x="20" y="208" width="0" height="0" xoffset="0" yoffset="27" xadvance="5" page="0" chnl="0" letter="space"/>
11
+ <char id="33" x="198" y="2" width="14" height="23" xoffset="-2" yoffset="5" xadvance="7" page="0" chnl="0" letter="!"/>
12
+ <char id="34" x="109" y="188" width="17" height="15" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&quot;"/>
13
+ <char id="35" x="149" y="29" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="#"/>
14
+ <char id="36" x="178" y="2" width="18" height="23" xoffset="-3" yoffset="5" xadvance="10" page="0" chnl="0" letter="$"/>
15
+ <char id="37" x="126" y="29" width="21" height="21" xoffset="-4" yoffset="6" xadvance="12" page="0" chnl="0" letter="%"/>
16
+ <char id="38" x="134" y="53" width="19" height="21" xoffset="-3" yoffset="6" xadvance="11" page="0" chnl="0" letter="&amp;"/>
17
+ <char id="39" x="77" y="188" width="14" height="16" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="0" letter="'"/>
18
+ <char id="40" x="56" y="2" width="15" height="25" xoffset="-2" yoffset="5" xadvance="8" page="0" chnl="0" letter="("/>
19
+ <char id="41" x="73" y="2" width="15" height="25" xoffset="-2" yoffset="5" xadvance="8" page="0" chnl="0" letter=")"/>
20
+ <char id="42" x="134" y="145" width="18" height="19" xoffset="-2" yoffset="5" xadvance="11" page="0" chnl="0" letter="*"/>
21
+ <char id="43" x="45" y="168" width="18" height="18" xoffset="-2" yoffset="7" xadvance="11" page="0" chnl="0" letter="+"/>
22
+ <char id="44" x="93" y="188" width="14" height="16" xoffset="-3" yoffset="14" xadvance="6" page="0" chnl="0" letter=","/>
23
+ <char id="45" x="2" y="208" width="16" height="12" xoffset="-1" yoffset="12" xadvance="10" page="0" chnl="0" letter="-"/>
24
+ <char id="46" x="167" y="188" width="14" height="14" xoffset="-3" yoffset="13" xadvance="6" page="0" chnl="0" letter="."/>
25
+ <char id="47" x="42" y="29" width="16" height="22" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="/"/>
26
+ <char id="48" x="176" y="53" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="0"/>
27
+ <char id="49" x="2" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="1"/>
28
+ <char id="50" x="22" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="2"/>
29
+ <char id="51" x="42" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="3"/>
30
+ <char id="52" x="62" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="4"/>
31
+ <char id="53" x="82" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="5"/>
32
+ <char id="54" x="102" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="6"/>
33
+ <char id="55" x="122" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="7"/>
34
+ <char id="56" x="142" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="8"/>
35
+ <char id="57" x="162" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="9"/>
36
+ <char id="58" x="118" y="145" width="14" height="20" xoffset="-3" yoffset="8" xadvance="6" page="0" chnl="0" letter=":"/>
37
+ <char id="59" x="78" y="29" width="14" height="22" xoffset="-3" yoffset="8" xadvance="6" page="0" chnl="0" letter=";"/>
38
+ <char id="60" x="42" y="145" width="17" height="21" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&lt;"/>
39
+ <char id="61" x="58" y="188" width="17" height="16" xoffset="-3" yoffset="8" xadvance="9" page="0" chnl="0" letter="="/>
40
+ <char id="62" x="61" y="145" width="17" height="21" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&gt;"/>
41
+ <char id="63" x="136" y="2" width="18" height="24" xoffset="-3" yoffset="5" xadvance="10" page="0" chnl="0" letter="?"/>
42
+ <char id="64" x="171" y="29" width="20" height="21" xoffset="-4" yoffset="8" xadvance="11" page="0" chnl="0" letter="@"/>
43
+ <char id="65" x="193" y="29" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="A"/>
44
+ <char id="66" x="182" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="B"/>
45
+ <char id="67" x="2" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="C"/>
46
+ <char id="68" x="22" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="D"/>
47
+ <char id="69" x="42" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="E"/>
48
+ <char id="70" x="62" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="F"/>
49
+ <char id="71" x="82" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="G"/>
50
+ <char id="72" x="102" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="H"/>
51
+ <char id="73" x="122" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="I"/>
52
+ <char id="74" x="142" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="J"/>
53
+ <char id="75" x="155" y="53" width="19" height="21" xoffset="-3" yoffset="6" xadvance="11" page="0" chnl="0" letter="K"/>
54
+ <char id="76" x="162" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="L"/>
55
+ <char id="77" x="2" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="M"/>
56
+ <char id="78" x="182" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="N"/>
57
+ <char id="79" x="24" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="O"/>
58
+ <char id="80" x="2" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="P"/>
59
+ <char id="81" x="156" y="2" width="20" height="23" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="Q"/>
60
+ <char id="82" x="22" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="R"/>
61
+ <char id="83" x="42" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="S"/>
62
+ <char id="84" x="62" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="T"/>
63
+ <char id="85" x="82" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="U"/>
64
+ <char id="86" x="46" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="V"/>
65
+ <char id="87" x="68" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="W"/>
66
+ <char id="88" x="90" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="X"/>
67
+ <char id="89" x="112" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="Y"/>
68
+ <char id="90" x="102" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="Z"/>
69
+ <char id="91" x="90" y="2" width="14" height="25" xoffset="-3" yoffset="5" xadvance="6" page="0" chnl="0" letter="["/>
70
+ <char id="92" x="60" y="29" width="16" height="22" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="\"/>
71
+ <char id="93" x="106" y="2" width="14" height="25" xoffset="-3" yoffset="5" xadvance="6" page="0" chnl="0" letter="]"/>
72
+ <char id="94" x="154" y="145" width="20" height="18" xoffset="-4" yoffset="5" xadvance="11" page="0" chnl="0" letter="^"/>
73
+ <char id="95" x="183" y="188" width="18" height="12" xoffset="-3" yoffset="18" xadvance="10" page="0" chnl="0" letter="_"/>
74
+ <char id="96" x="150" y="188" width="15" height="14" xoffset="-4" yoffset="5" xadvance="6" page="0" chnl="0" letter="`"/>
75
+ <char id="97" x="24" y="168" width="19" height="18" xoffset="-4" yoffset="9" xadvance="10" page="0" chnl="0" letter="a"/>
76
+ <char id="98" x="122" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="b"/>
77
+ <char id="99" x="2" y="188" width="17" height="18" xoffset="-3" yoffset="9" xadvance="9" page="0" chnl="0" letter="c"/>
78
+ <char id="100" x="142" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="d"/>
79
+ <char id="101" x="21" y="188" width="17" height="18" xoffset="-3" yoffset="9" xadvance="9" page="0" chnl="0" letter="e"/>
80
+ <char id="102" x="162" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="f"/>
81
+ <char id="103" x="2" y="29" width="18" height="22" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="g"/>
82
+ <char id="104" x="182" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="h"/>
83
+ <char id="105" x="94" y="29" width="14" height="22" xoffset="-1" yoffset="5" xadvance="8" page="0" chnl="0" letter="i"/>
84
+ <char id="106" x="2" y="2" width="16" height="25" xoffset="-2" yoffset="5" xadvance="9" page="0" chnl="0" letter="j"/>
85
+ <char id="107" x="80" y="145" width="17" height="21" xoffset="-2" yoffset="6" xadvance="10" page="0" chnl="0" letter="k"/>
86
+ <char id="108" x="110" y="29" width="14" height="22" xoffset="-1" yoffset="5" xadvance="8" page="0" chnl="0" letter="l"/>
87
+ <char id="109" x="176" y="145" width="20" height="18" xoffset="-4" yoffset="9" xadvance="11" page="0" chnl="0" letter="m"/>
88
+ <char id="110" x="65" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="n"/>
89
+ <char id="111" x="85" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="o"/>
90
+ <char id="112" x="2" y="145" width="18" height="21" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="p"/>
91
+ <char id="113" x="22" y="145" width="18" height="21" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="q"/>
92
+ <char id="114" x="105" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="r"/>
93
+ <char id="115" x="40" y="188" width="16" height="18" xoffset="-2" yoffset="9" xadvance="9" page="0" chnl="0" letter="s"/>
94
+ <char id="116" x="99" y="145" width="17" height="21" xoffset="-3" yoffset="6" xadvance="9" page="0" chnl="0" letter="t"/>
95
+ <char id="117" x="125" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="u"/>
96
+ <char id="118" x="145" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="v"/>
97
+ <char id="119" x="2" y="168" width="20" height="18" xoffset="-4" yoffset="9" xadvance="11" page="0" chnl="0" letter="w"/>
98
+ <char id="120" x="165" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="x"/>
99
+ <char id="121" x="22" y="29" width="18" height="22" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="y"/>
100
+ <char id="122" x="185" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="z"/>
101
+ <char id="123" x="20" y="2" width="16" height="25" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="{"/>
102
+ <char id="124" x="122" y="2" width="12" height="25" xoffset="-3" yoffset="5" xadvance="4" page="0" chnl="0" letter="|"/>
103
+ <char id="125" x="38" y="2" width="16" height="25" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="}"/>
104
+ <char id="126" x="128" y="188" width="20" height="14" xoffset="-4" yoffset="10" xadvance="11" page="0" chnl="0" letter="~"/>
105
+ </chars>
106
+ <kernings count="0"/>
107
+ </font>