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.
- package/README.ko.md +550 -0
- package/README.md +575 -4
- package/examples/auto-battle/assets/bgm/battle.mp3 +0 -0
- package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
- package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
- package/examples/auto-battle/assets/joystick/joystick.png +0 -0
- package/examples/auto-battle/assets/joystick/knob.png +0 -0
- package/examples/auto-battle/assets/sfx/hero/die/die.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/heal/heal.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/hit/hit1.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/hit/hit2.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/hit/hit3.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/miss/miss1.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/miss/miss2.wav +0 -0
- package/examples/auto-battle/assets/sfx/hero/miss/miss3.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/die/die.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/hit/hit1.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/hit/hit2.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/hit/hit3.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/miss/miss1.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/miss/miss2.wav +0 -0
- package/examples/auto-battle/assets/sfx/orc/miss/miss3.wav +0 -0
- package/examples/auto-battle/assets/spritesheets/hero-atlas.json +246 -0
- package/examples/auto-battle/assets/spritesheets/hero.png +0 -0
- package/examples/auto-battle/assets/spritesheets/orc-atlas.json +246 -0
- package/examples/auto-battle/assets/spritesheets/orc.png +0 -0
- package/examples/auto-battle/assets/spritesheets/potion-atlas.json +68 -0
- package/examples/auto-battle/assets/spritesheets/potion.png +0 -0
- package/examples/auto-battle/dist/game.js +2 -0
- package/examples/auto-battle/dist/game.js.LICENSE.txt +35 -0
- package/examples/auto-battle/hud/damage-text.ts +46 -0
- package/examples/auto-battle/hud/heal-text.ts +46 -0
- package/examples/auto-battle/hud/hp-bar.ts +38 -0
- package/examples/auto-battle/index.ts +41 -0
- package/examples/auto-battle/objects/character.ts +95 -0
- package/examples/auto-battle/objects/hero.ts +119 -0
- package/examples/auto-battle/objects/orc.ts +107 -0
- package/examples/auto-battle/objects/potion.ts +27 -0
- package/examples/auto-battle/stage.ts +366 -0
- package/examples/battle-benchmark-matterjs/assets/bgm/battle.mp3 +0 -0
- package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.fnt +107 -0
- package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.png +0 -0
- package/examples/battle-benchmark-matterjs/assets/joystick/joystick.png +0 -0
- package/examples/battle-benchmark-matterjs/assets/joystick/knob.png +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/die/die.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/heal/heal.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/die/die.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/hero-atlas.json +246 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/hero.png +0 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/orc-atlas.json +246 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/orc.png +0 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/potion-atlas.json +68 -0
- package/examples/battle-benchmark-matterjs/assets/spritesheets/potion.png +0 -0
- package/examples/battle-benchmark-matterjs/dist/game.js +2 -0
- package/examples/battle-benchmark-matterjs/dist/game.js.LICENSE.txt +35 -0
- package/examples/battle-benchmark-matterjs/hud/damage-text.ts +46 -0
- package/examples/battle-benchmark-matterjs/hud/heal-text.ts +46 -0
- package/examples/battle-benchmark-matterjs/hud/hp-bar.ts +38 -0
- package/examples/battle-benchmark-matterjs/index.html +24 -0
- package/examples/battle-benchmark-matterjs/index.ts +41 -0
- package/examples/battle-benchmark-matterjs/objects/character.ts +95 -0
- package/examples/battle-benchmark-matterjs/objects/hero.ts +111 -0
- package/examples/battle-benchmark-matterjs/objects/orc.ts +107 -0
- package/examples/battle-benchmark-matterjs/objects/potion.ts +27 -0
- package/examples/battle-benchmark-matterjs/stage.ts +177 -0
- package/examples/battle-benchmark-separation/assets/bgm/battle.mp3 +0 -0
- package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.fnt +107 -0
- package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.png +0 -0
- package/examples/battle-benchmark-separation/assets/joystick/joystick.png +0 -0
- package/examples/battle-benchmark-separation/assets/joystick/knob.png +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/die/die.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/heal/heal.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/die/die.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/hero-atlas.json +246 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/hero.png +0 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/orc-atlas.json +246 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/orc.png +0 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/potion-atlas.json +68 -0
- package/examples/battle-benchmark-separation/assets/spritesheets/potion.png +0 -0
- package/examples/battle-benchmark-separation/dist/game.js +2 -0
- package/examples/battle-benchmark-separation/dist/game.js.LICENSE.txt +35 -0
- package/examples/battle-benchmark-separation/hud/damage-text.ts +46 -0
- package/examples/battle-benchmark-separation/hud/heal-text.ts +46 -0
- package/examples/battle-benchmark-separation/hud/hp-bar.ts +38 -0
- package/examples/battle-benchmark-separation/index.html +24 -0
- package/examples/battle-benchmark-separation/index.ts +41 -0
- package/examples/battle-benchmark-separation/objects/character.ts +225 -0
- package/examples/battle-benchmark-separation/objects/hero.ts +110 -0
- package/examples/battle-benchmark-separation/objects/orc.ts +213 -0
- package/examples/battle-benchmark-separation/objects/potion.ts +27 -0
- package/examples/battle-benchmark-separation/stage.ts +178 -0
- package/examples/battle-benchmark-separation2/assets/bgm/battle.mp3 +0 -0
- package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.fnt +107 -0
- package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.png +0 -0
- package/examples/battle-benchmark-separation2/assets/joystick/joystick.png +0 -0
- package/examples/battle-benchmark-separation2/assets/joystick/knob.png +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/die/die.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/heal/heal.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/die/die.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit1.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit2.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit3.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss1.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss2.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss3.wav +0 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/hero-atlas.json +246 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/hero.png +0 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/orc-atlas.json +246 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/orc.png +0 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/potion-atlas.json +68 -0
- package/examples/battle-benchmark-separation2/assets/spritesheets/potion.png +0 -0
- package/examples/battle-benchmark-separation2/dist/game.js +2 -0
- package/examples/battle-benchmark-separation2/dist/game.js.LICENSE.txt +35 -0
- package/examples/battle-benchmark-separation2/hud/damage-text.ts +46 -0
- package/examples/battle-benchmark-separation2/hud/heal-text.ts +46 -0
- package/examples/battle-benchmark-separation2/hud/hp-bar.ts +38 -0
- package/examples/battle-benchmark-separation2/index.html +24 -0
- package/examples/battle-benchmark-separation2/index.ts +41 -0
- package/examples/battle-benchmark-separation2/objects/character.ts +195 -0
- package/examples/battle-benchmark-separation2/objects/hero.ts +110 -0
- package/examples/battle-benchmark-separation2/objects/orc.ts +213 -0
- package/examples/battle-benchmark-separation2/objects/potion.ts +27 -0
- package/examples/battle-benchmark-separation2/stage.ts +178 -0
- package/examples/collision-test/assets/cat.png +0 -0
- package/examples/collision-test/dist/game.js +2 -0
- package/examples/collision-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/collision-test/index.html +24 -0
- package/examples/collision-test/index.ts +30 -0
- package/examples/dom-particle-test/assets/bird.png +0 -0
- package/examples/dom-particle-test/dist/game.js +2 -0
- package/examples/dom-particle-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/dom-particle-test/index.html +24 -0
- package/examples/dom-particle-test/index.ts +27 -0
- package/examples/dom-sprite-test/assets/bird.png +0 -0
- package/examples/dom-sprite-test/assets/fire.png +0 -0
- package/examples/dom-sprite-test/assets/run.png +0 -0
- package/examples/dom-sprite-test/dist/game.js +2 -0
- package/examples/dom-sprite-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/dom-sprite-test/index.html +24 -0
- package/examples/dom-sprite-test/index.ts +35 -0
- package/examples/dom-test/dist/game.js +2 -0
- package/examples/dom-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/dom-test/index.html +24 -0
- package/examples/dom-test/index.ts +22 -0
- package/examples/particle-test/assets/bird.png +0 -0
- package/examples/particle-test/dist/game.js +2 -0
- package/examples/particle-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/particle-test/index.html +24 -0
- package/examples/particle-test/index.ts +30 -0
- package/examples/renderer-test/dist/game.js +2 -0
- package/examples/renderer-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/renderer-test/index.html +24 -0
- package/examples/renderer-test/index.ts +9 -0
- package/examples/simple-battle/assets/bgm/battle.mp3 +0 -0
- package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
- package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
- package/examples/simple-battle/assets/joystick/joystick.png +0 -0
- package/examples/simple-battle/assets/joystick/knob.png +0 -0
- package/examples/simple-battle/assets/sfx/hero/die/die.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/heal/heal.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/hit/hit1.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/hit/hit2.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/hit/hit3.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/miss/miss1.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/miss/miss2.wav +0 -0
- package/examples/simple-battle/assets/sfx/hero/miss/miss3.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/die/die.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/hit/hit1.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/hit/hit2.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/hit/hit3.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/miss/miss1.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/miss/miss2.wav +0 -0
- package/examples/simple-battle/assets/sfx/orc/miss/miss3.wav +0 -0
- package/examples/simple-battle/assets/spritesheets/hero-atlas.json +246 -0
- package/examples/simple-battle/assets/spritesheets/hero.png +0 -0
- package/examples/simple-battle/assets/spritesheets/orc-atlas.json +246 -0
- package/examples/simple-battle/assets/spritesheets/orc.png +0 -0
- package/examples/simple-battle/assets/spritesheets/potion-atlas.json +68 -0
- package/examples/simple-battle/assets/spritesheets/potion.png +0 -0
- package/examples/simple-battle/dist/game.js +2 -0
- package/examples/simple-battle/dist/game.js.LICENSE.txt +35 -0
- package/examples/simple-battle/hud/damage-text.ts +46 -0
- package/examples/simple-battle/hud/heal-text.ts +46 -0
- package/examples/simple-battle/hud/hp-bar.ts +38 -0
- package/examples/simple-battle/index.html +24 -0
- package/examples/simple-battle/index.ts +41 -0
- package/examples/simple-battle/objects/character.ts +95 -0
- package/examples/simple-battle/objects/hero.ts +111 -0
- package/examples/simple-battle/objects/orc.ts +107 -0
- package/examples/simple-battle/objects/potion.ts +27 -0
- package/examples/simple-battle/stage.ts +174 -0
- package/examples/spine-test/assets/spine/spineboy.atlas +95 -0
- package/examples/spine-test/assets/spine/spineboy.png +0 -0
- package/examples/spine-test/assets/spine/spineboy.skel +0 -0
- package/examples/spine-test/dist/game.js +2 -0
- package/examples/spine-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/spine-test/index.html +24 -0
- package/examples/spine-test/index.ts +29 -0
- package/examples/sprite-test/assets/bird.png +0 -0
- package/examples/sprite-test/assets/fire.png +0 -0
- package/examples/sprite-test/dist/game.js +2 -0
- package/examples/sprite-test/dist/game.js.LICENSE.txt +35 -0
- package/examples/sprite-test/index.html +24 -0
- package/examples/sprite-test/index.ts +38 -0
- package/examples/tsconfig.json +2 -1
- package/examples/webpack.config.js +17 -3
- package/jest.config.ts +10 -0
- package/lib/asset/audio.js +47 -11
- package/lib/asset/audio.js.map +1 -1
- package/lib/asset/loaders/audio.js +7 -4
- package/lib/asset/loaders/audio.js.map +1 -1
- package/lib/asset/loaders/binary.js +7 -4
- package/lib/asset/loaders/binary.js.map +1 -1
- package/lib/asset/loaders/bitmap-font.js +74 -0
- package/lib/asset/loaders/bitmap-font.js.map +1 -0
- package/lib/asset/loaders/font.js +4 -1
- package/lib/asset/loaders/font.js.map +1 -1
- package/lib/asset/loaders/loader.js +17 -12
- package/lib/asset/loaders/loader.js.map +1 -1
- package/lib/asset/loaders/spritesheet.js +18 -8
- package/lib/asset/loaders/spritesheet.js.map +1 -1
- package/lib/asset/loaders/text.js +6 -3
- package/lib/asset/loaders/text.js.map +1 -1
- package/lib/asset/loaders/texture.js +22 -26
- package/lib/asset/loaders/texture.js.map +1 -1
- package/lib/asset/preload.js +60 -56
- package/lib/asset/preload.js.map +1 -1
- package/lib/collision/check-collision.js +804 -0
- package/lib/collision/check-collision.js.map +1 -0
- package/lib/collision/check-collision.test.js +300 -0
- package/lib/collision/check-collision.test.js.map +1 -0
- package/lib/collision/colliders.js +8 -0
- package/lib/collision/colliders.js.map +1 -0
- package/lib/debug.js.map +1 -0
- package/lib/dom/dom-animated-sprite.js +106 -0
- package/lib/dom/dom-animated-sprite.js.map +1 -0
- package/lib/dom/dom-game-object.js +108 -0
- package/lib/dom/dom-game-object.js.map +1 -0
- package/lib/dom/dom-particle.js +105 -0
- package/lib/dom/dom-particle.js.map +1 -0
- package/lib/dom/dom-preload.js +43 -0
- package/lib/dom/dom-preload.js.map +1 -0
- package/lib/dom/dom-sprite.js +40 -0
- package/lib/dom/dom-sprite.js.map +1 -0
- package/lib/dom/dom-texture-loader.js +36 -0
- package/lib/dom/dom-texture-loader.js.map +1 -0
- package/lib/dom/dom-utils.js +20 -0
- package/lib/dom/dom-utils.js.map +1 -0
- package/lib/index copy.js +16 -0
- package/lib/index copy.js.map +1 -0
- package/lib/index.js +36 -10
- package/lib/index.js.map +1 -1
- package/lib/input/joystick.js +262 -0
- package/lib/input/joystick.js.map +1 -0
- package/lib/node/core/dirty-number.js +19 -0
- package/lib/node/core/dirty-number.js.map +1 -0
- package/lib/node/core/game-node.js +63 -0
- package/lib/node/core/game-node.js.map +1 -0
- package/lib/node/core/game-object.js +8 -0
- package/lib/node/core/game-object.js.map +1 -0
- package/lib/node/core/renderable.js +59 -0
- package/lib/node/core/renderable.js.map +1 -0
- package/lib/node/core/transform.js +70 -0
- package/lib/node/core/transform.js.map +1 -0
- package/lib/node/core/transformable.js +85 -0
- package/lib/node/core/transformable.js.map +1 -0
- package/lib/node/ext/animated-sprite.js +77 -0
- package/lib/node/ext/animated-sprite.js.map +1 -0
- package/lib/node/ext/bitmap-text.js +93 -0
- package/lib/node/ext/bitmap-text.js.map +1 -0
- package/lib/node/ext/circle.js +43 -0
- package/lib/node/ext/circle.js.map +1 -0
- package/lib/node/ext/deplay.js +22 -0
- package/lib/node/ext/deplay.js.map +1 -0
- package/lib/node/ext/dom-container.js +51 -0
- package/lib/node/ext/dom-container.js.map +1 -0
- package/lib/node/ext/interval.js +22 -0
- package/lib/node/ext/interval.js.map +1 -0
- package/lib/node/ext/particle.js +98 -0
- package/lib/node/ext/particle.js.map +1 -0
- package/lib/node/ext/rectangle.js +52 -0
- package/lib/node/ext/rectangle.js.map +1 -0
- package/lib/node/ext/spine.js +272 -0
- package/lib/node/ext/spine.js.map +1 -0
- package/lib/node/ext/sprite.js +42 -0
- package/lib/node/ext/sprite.js.map +1 -0
- package/lib/node/physics/physics-object.js +92 -0
- package/lib/node/physics/physics-object.js.map +1 -0
- package/lib/node/physics/physics-world.js +29 -0
- package/lib/node/physics/physics-world.js.map +1 -0
- package/lib/node/physics/rigidbodies.js +7 -0
- package/lib/node/physics/rigidbodies.js.map +1 -0
- package/lib/renderer/camera.js +19 -0
- package/lib/renderer/camera.js.map +1 -0
- package/lib/renderer/container-manager.js +29 -0
- package/lib/renderer/container-manager.js.map +1 -0
- package/lib/renderer/fps-display.js +18 -0
- package/lib/renderer/fps-display.js.map +1 -0
- package/lib/renderer/layer.js +12 -0
- package/lib/renderer/layer.js.map +1 -0
- package/lib/renderer/renderer.js +146 -0
- package/lib/renderer/renderer.js.map +1 -0
- package/lib/renderer/ticker.js +56 -0
- package/lib/renderer/ticker.js.map +1 -0
- package/lib/renderer/ticker.test.js +241 -0
- package/lib/renderer/ticker.test.js.map +1 -0
- package/lib/types/animation-atlas.js +2 -0
- package/lib/types/animation-atlas.js.map +1 -0
- package/lib/types/asset/audio.d.ts +5 -4
- package/lib/types/asset/audio.d.ts.map +1 -1
- package/lib/types/asset/loaders/audio.d.ts +2 -1
- package/lib/types/asset/loaders/audio.d.ts.map +1 -1
- package/lib/types/asset/loaders/binary.d.ts +2 -1
- package/lib/types/asset/loaders/binary.d.ts.map +1 -1
- package/lib/types/asset/loaders/bitmap-font.d.ts +17 -0
- package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -0
- package/lib/types/asset/loaders/font.d.ts +2 -1
- package/lib/types/asset/loaders/font.d.ts.map +1 -1
- package/lib/types/asset/loaders/loader.d.ts +6 -6
- package/lib/types/asset/loaders/loader.d.ts.map +1 -1
- package/lib/types/asset/loaders/spritesheet.d.ts +14 -6
- package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
- package/lib/types/asset/loaders/text.d.ts +2 -1
- package/lib/types/asset/loaders/text.d.ts.map +1 -1
- package/lib/types/asset/loaders/texture.d.ts +2 -2
- package/lib/types/asset/loaders/texture.d.ts.map +1 -1
- package/lib/types/asset/preload.d.ts +7 -5
- package/lib/types/asset/preload.d.ts.map +1 -1
- package/lib/types/atlas copy.js +2 -0
- package/lib/types/atlas copy.js.map +1 -0
- package/lib/types/atlas.js +2 -0
- package/lib/types/atlas.js.map +1 -0
- package/lib/types/bitmap-font.js +2 -0
- package/lib/types/bitmap-font.js.map +1 -0
- package/lib/types/collision/check-collision.d.ts +4 -0
- package/lib/types/collision/check-collision.d.ts.map +1 -0
- package/lib/types/collision/check-collision.test.d.ts +2 -0
- package/lib/types/collision/check-collision.test.d.ts.map +1 -0
- package/lib/types/collision/colliders.d.ts +34 -0
- package/lib/types/collision/colliders.d.ts.map +1 -0
- package/lib/types/debug.d.ts.map +1 -0
- package/lib/types/dom/dom-animated-sprite.d.ts +23 -0
- package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -0
- package/lib/types/dom/dom-game-object.d.ts +44 -0
- package/lib/types/dom/dom-game-object.d.ts.map +1 -0
- package/lib/types/dom/dom-particle.d.ts +30 -0
- package/lib/types/dom/dom-particle.d.ts.map +1 -0
- package/lib/types/dom/dom-preload.d.ts +2 -0
- package/lib/types/dom/dom-preload.d.ts.map +1 -0
- package/lib/types/dom/dom-sprite.d.ts +13 -0
- package/lib/types/dom/dom-sprite.d.ts.map +1 -0
- package/lib/types/dom/dom-texture-loader.d.ts +8 -0
- package/lib/types/dom/dom-texture-loader.d.ts.map +1 -0
- package/lib/types/dom/dom-utils.d.ts +3 -0
- package/lib/types/dom/dom-utils.d.ts.map +1 -0
- package/lib/types/index copy.d.ts +16 -0
- package/lib/types/index copy.d.ts.map +1 -0
- package/lib/types/index.d.ts +26 -11
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/input/joystick.d.ts +28 -0
- package/lib/types/input/joystick.d.ts.map +1 -0
- package/lib/types/node/core/dirty-number.d.ts +9 -0
- package/lib/types/node/core/dirty-number.d.ts.map +1 -0
- package/lib/types/node/core/game-node.d.ts +16 -0
- package/lib/types/node/core/game-node.d.ts.map +1 -0
- package/lib/types/node/core/game-object.d.ts +8 -0
- package/lib/types/node/core/game-object.d.ts.map +1 -0
- package/lib/types/node/core/renderable.d.ts +23 -0
- package/lib/types/node/core/renderable.d.ts.map +1 -0
- package/lib/types/node/core/transform.d.ts +27 -0
- package/lib/types/node/core/transform.d.ts.map +1 -0
- package/lib/types/node/core/transformable.d.ts +44 -0
- package/lib/types/node/core/transformable.d.ts.map +1 -0
- package/lib/types/node/ext/animated-sprite.d.ts +22 -0
- package/lib/types/node/ext/animated-sprite.d.ts.map +1 -0
- package/lib/types/node/ext/bitmap-text.d.ts +14 -0
- package/lib/types/node/ext/bitmap-text.d.ts.map +1 -0
- package/lib/types/node/ext/circle.d.ts +19 -0
- package/lib/types/node/ext/circle.d.ts.map +1 -0
- package/lib/types/node/ext/deplay.d.ts +8 -0
- package/lib/types/node/ext/deplay.d.ts.map +1 -0
- package/lib/types/node/ext/dom-container.d.ts +12 -0
- package/lib/types/node/ext/dom-container.d.ts.map +1 -0
- package/lib/types/node/ext/interval.d.ts +9 -0
- package/lib/types/node/ext/interval.d.ts.map +1 -0
- package/lib/types/node/ext/particle.d.ts +30 -0
- package/lib/types/node/ext/particle.d.ts.map +1 -0
- package/lib/types/node/ext/rectangle.d.ts +22 -0
- package/lib/types/node/ext/rectangle.d.ts.map +1 -0
- package/lib/types/node/ext/spine.d.ts +36 -0
- package/lib/types/node/ext/spine.d.ts.map +1 -0
- package/lib/types/node/ext/sprite.d.ts +13 -0
- package/lib/types/node/ext/sprite.d.ts.map +1 -0
- package/lib/types/node/physics/physics-object.d.ts +38 -0
- package/lib/types/node/physics/physics-object.d.ts.map +1 -0
- package/lib/types/node/physics/physics-world.d.ts +18 -0
- package/lib/types/node/physics/physics-world.d.ts.map +1 -0
- package/lib/types/node/physics/rigidbodies.d.ts +23 -0
- package/lib/types/node/physics/rigidbodies.d.ts.map +1 -0
- package/lib/types/renderer/camera.d.ts +13 -0
- package/lib/types/renderer/camera.d.ts.map +1 -0
- package/lib/types/renderer/container-manager.d.ts +9 -0
- package/lib/types/renderer/container-manager.d.ts.map +1 -0
- package/lib/types/renderer/fps-display.d.ts +7 -0
- package/lib/types/renderer/fps-display.d.ts.map +1 -0
- package/lib/types/renderer/layer.d.ts +7 -0
- package/lib/types/renderer/layer.d.ts.map +1 -0
- package/lib/types/renderer/renderer.d.ts +40 -0
- package/lib/types/renderer/renderer.d.ts.map +1 -0
- package/lib/types/renderer/ticker.d.ts +6 -0
- package/lib/types/renderer/ticker.d.ts.map +1 -0
- package/lib/types/renderer/ticker.test.d.ts +40 -0
- package/lib/types/renderer/ticker.test.d.ts.map +1 -0
- package/lib/types/sprite-atlas.js +2 -0
- package/lib/types/sprite-atlas.js.map +1 -0
- package/lib/types/types/animation-atlas.d.ts +14 -0
- package/lib/types/types/animation-atlas.d.ts.map +1 -0
- package/lib/types/types/atlas copy.d.ts +12 -0
- package/lib/types/types/atlas copy.d.ts.map +1 -0
- package/lib/types/types/atlas.d.ts +16 -0
- package/lib/types/types/atlas.d.ts.map +1 -0
- package/lib/types/types/bitmap-font.d.ts +18 -0
- package/lib/types/types/bitmap-font.d.ts.map +1 -0
- package/lib/types/types/sprite-atlas.d.ts +13 -0
- package/lib/types/types/sprite-atlas.d.ts.map +1 -0
- package/lib/types/utils/device.d.ts +2 -0
- package/lib/types/utils/device.d.ts.map +1 -0
- package/lib/utils/device.js +2 -0
- package/lib/utils/device.js.map +1 -0
- package/package.json +8 -7
- package/src/asset/audio.ts +134 -90
- package/src/asset/loaders/audio.ts +23 -20
- package/src/asset/loaders/binary.ts +20 -16
- package/src/asset/loaders/bitmap-font.ts +91 -0
- package/src/asset/loaders/font.ts +18 -14
- package/src/asset/loaders/loader.ts +27 -23
- package/src/asset/loaders/spritesheet.ts +47 -36
- package/src/asset/loaders/text.ts +19 -15
- package/src/asset/loaders/texture.ts +30 -37
- package/src/asset/preload.ts +71 -64
- package/src/collision/check-collision.test.ts +349 -0
- package/src/collision/check-collision.ts +821 -0
- package/src/collision/colliders.ts +19 -0
- package/src/debug.ts +5 -0
- package/src/dom/dom-animated-sprite.ts +132 -0
- package/src/dom/dom-game-object.ts +134 -0
- package/src/dom/dom-particle.ts +151 -0
- package/src/dom/dom-preload.ts +54 -0
- package/src/dom/dom-sprite.ts +50 -0
- package/src/dom/dom-texture-loader.ts +44 -0
- package/src/dom/dom-utils.ts +19 -0
- package/src/index.ts +47 -13
- package/src/input/joystick.ts +316 -0
- package/src/node/core/dirty-number.ts +21 -0
- package/src/node/core/game-node.ts +74 -0
- package/src/node/core/game-object.ts +11 -0
- package/src/node/core/renderable.ts +72 -0
- package/src/node/core/transform.ts +82 -0
- package/src/node/core/transformable.ts +111 -0
- package/src/node/ext/animated-sprite.ts +103 -0
- package/src/node/ext/bitmap-text.ts +113 -0
- package/src/node/ext/circle.ts +55 -0
- package/src/node/ext/deplay.ts +25 -0
- package/src/node/ext/dom-container.ts +62 -0
- package/src/node/ext/interval.ts +25 -0
- package/src/node/ext/particle.ts +142 -0
- package/src/node/ext/rectangle.ts +71 -0
- package/src/node/ext/spine.ts +323 -0
- package/src/node/ext/sprite.ts +53 -0
- package/src/node/physics/physics-object.ts +127 -0
- package/src/node/physics/physics-world.ts +41 -0
- package/src/node/physics/rigidbodies.ts +14 -0
- package/src/renderer/camera.ts +25 -0
- package/src/renderer/container-manager.ts +36 -0
- package/src/renderer/fps-display.ts +21 -0
- package/src/renderer/layer.ts +15 -0
- package/src/renderer/renderer.ts +181 -0
- package/src/renderer/ticker.test.ts +325 -0
- package/src/renderer/ticker.ts +54 -0
- package/src/types/atlas.ts +17 -0
- package/src/types/bitmap-font.ts +19 -0
- package/src/utils/device.ts +1 -0
- package/examples/test-dom/index.ts +0 -21
- package/lib/game-object/game-object-physics.js +0 -188
- package/lib/game-object/game-object-physics.js.map +0 -1
- package/lib/game-object/game-object-rendering.js +0 -35
- package/lib/game-object/game-object-rendering.js.map +0 -1
- package/lib/game-object/game-object.js +0 -162
- package/lib/game-object/game-object.js.map +0 -1
- package/lib/game-object/transform.js +0 -118
- package/lib/game-object/transform.js.map +0 -1
- package/lib/game-object-ext/animated-sprite.js +0 -117
- package/lib/game-object-ext/animated-sprite.js.map +0 -1
- package/lib/game-object-ext/dom-container.js +0 -56
- package/lib/game-object-ext/dom-container.js.map +0 -1
- package/lib/game-object-ext/rect.js +0 -30
- package/lib/game-object-ext/rect.js.map +0 -1
- package/lib/game-object-ext/spine.js +0 -206
- package/lib/game-object-ext/spine.js.map +0 -1
- package/lib/game-object-ext/sprite.js +0 -46
- package/lib/game-object-ext/sprite.js.map +0 -1
- package/lib/game-object-ext/text.js +0 -68
- package/lib/game-object-ext/text.js.map +0 -1
- package/lib/game-object-ext/tiling-sprite.js +0 -64
- package/lib/game-object-ext/tiling-sprite.js.map +0 -1
- package/lib/types/game-object/game-object-physics.d.ts +0 -42
- package/lib/types/game-object/game-object-physics.d.ts.map +0 -1
- package/lib/types/game-object/game-object-rendering.d.ts +0 -15
- package/lib/types/game-object/game-object-rendering.d.ts.map +0 -1
- package/lib/types/game-object/game-object.d.ts +0 -81
- package/lib/types/game-object/game-object.d.ts.map +0 -1
- package/lib/types/game-object/transform.d.ts +0 -43
- package/lib/types/game-object/transform.d.ts.map +0 -1
- package/lib/types/game-object-ext/animated-sprite.d.ts +0 -29
- package/lib/types/game-object-ext/animated-sprite.d.ts.map +0 -1
- package/lib/types/game-object-ext/dom-container.d.ts +0 -16
- package/lib/types/game-object-ext/dom-container.d.ts.map +0 -1
- package/lib/types/game-object-ext/rect.d.ts +0 -17
- package/lib/types/game-object-ext/rect.d.ts.map +0 -1
- package/lib/types/game-object-ext/spine.d.ts +0 -35
- package/lib/types/game-object-ext/spine.d.ts.map +0 -1
- package/lib/types/game-object-ext/sprite.d.ts +0 -14
- package/lib/types/game-object-ext/sprite.d.ts.map +0 -1
- package/lib/types/game-object-ext/text.d.ts +0 -26
- package/lib/types/game-object-ext/text.d.ts.map +0 -1
- package/lib/types/game-object-ext/tiling-sprite.d.ts +0 -20
- package/lib/types/game-object-ext/tiling-sprite.d.ts.map +0 -1
- package/lib/types/utils/debug.d.ts.map +0 -1
- package/lib/types/utils/go.d.ts +0 -26
- package/lib/types/utils/go.d.ts.map +0 -1
- package/lib/types/world/world-debug.d.ts +0 -11
- package/lib/types/world/world-debug.d.ts.map +0 -1
- package/lib/types/world/world-physics.d.ts +0 -16
- package/lib/types/world/world-physics.d.ts.map +0 -1
- package/lib/types/world/world-rendering.d.ts +0 -28
- package/lib/types/world/world-rendering.d.ts.map +0 -1
- package/lib/types/world/world.d.ts +0 -38
- package/lib/types/world/world.d.ts.map +0 -1
- package/lib/utils/debug.js.map +0 -1
- package/lib/utils/go.js +0 -33
- package/lib/utils/go.js.map +0 -1
- package/lib/world/world-debug.js +0 -89
- package/lib/world/world-debug.js.map +0 -1
- package/lib/world/world-physics.js +0 -45
- package/lib/world/world-physics.js.map +0 -1
- package/lib/world/world-rendering.js +0 -123
- package/lib/world/world-rendering.js.map +0 -1
- package/lib/world/world.js +0 -147
- package/lib/world/world.js.map +0 -1
- package/src/game-object/game-object-physics.ts +0 -191
- package/src/game-object/game-object-rendering.ts +0 -27
- package/src/game-object/game-object.ts +0 -190
- package/src/game-object/transform.ts +0 -164
- package/src/game-object-ext/animated-sprite.ts +0 -140
- package/src/game-object-ext/dom-container.ts +0 -67
- package/src/game-object-ext/rect.ts +0 -40
- package/src/game-object-ext/spine.ts +0 -235
- package/src/game-object-ext/sprite.ts +0 -55
- package/src/game-object-ext/text.ts +0 -83
- package/src/game-object-ext/tiling-sprite.ts +0 -73
- package/src/utils/debug.ts +0 -5
- package/src/utils/go.ts +0 -53
- package/src/world/world-debug.ts +0 -114
- package/src/world/world-physics.ts +0 -52
- package/src/world/world-rendering.ts +0 -145
- package/src/world/world.ts +0 -171
- /package/examples/{test-dom → auto-battle}/index.html +0 -0
- /package/lib/{utils/debug.js → debug.js} +0 -0
- /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
|
+
}
|
|
Binary file
|