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,316 @@
|
|
|
1
|
+
import { setStyle } from '../dom/dom-utils'
|
|
2
|
+
import { GameObject } from '../node/core/game-object'
|
|
3
|
+
import { Renderer } from '../renderer/renderer'
|
|
4
|
+
|
|
5
|
+
const ARROW_CODES = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'])
|
|
6
|
+
|
|
7
|
+
function isArrow(code: string): boolean {
|
|
8
|
+
return ARROW_CODES.has(code)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function clampVector(dx: number, dy: number, maxR: number) {
|
|
12
|
+
const dist = Math.hypot(dx, dy)
|
|
13
|
+
if (dist <= maxR || dist === 0) return { x: dx, y: dy, dist }
|
|
14
|
+
const s = maxR / dist
|
|
15
|
+
return { x: dx * s, y: dy * s, dist: maxR }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function setPosition(el: HTMLElement | undefined, left: number, top: number) {
|
|
19
|
+
if (!el) return
|
|
20
|
+
el.style.left = `${left}px`
|
|
21
|
+
el.style.top = `${top}px`
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type JoystickOptions = {
|
|
25
|
+
// 공통 필수 콜백
|
|
26
|
+
onMove: (radian: number, strength: number) => void // 키보드일 때 strength=1
|
|
27
|
+
onRelease: () => void
|
|
28
|
+
|
|
29
|
+
// 선택 콜백
|
|
30
|
+
onKeyDown?: (code: string) => void
|
|
31
|
+
|
|
32
|
+
// (선택) 터치 전용 리소스/옵션
|
|
33
|
+
joystickImage?: HTMLElement // 조이스틱 배경
|
|
34
|
+
knobImage?: HTMLElement // 노브(스틱)
|
|
35
|
+
maxKnobDistance?: number // px (기본 80)
|
|
36
|
+
moveThreshold?: number // px (기본 0)
|
|
37
|
+
idlePosition?: { left: number; top: number } // 이미지 기본 위치 (기본값은 숨김 위치 -999999, -999999)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class Joystick extends GameObject {
|
|
41
|
+
// 키보드 상태
|
|
42
|
+
#codesPressed = new Set<string>()
|
|
43
|
+
#arrowCodesPressed = new Set<string>()
|
|
44
|
+
|
|
45
|
+
// 터치 상태
|
|
46
|
+
#activeTouchId?: number
|
|
47
|
+
#touchStartX = 0
|
|
48
|
+
#touchStartY = 0
|
|
49
|
+
#moving = false
|
|
50
|
+
|
|
51
|
+
// DOM (터치용)
|
|
52
|
+
#joystickImage?: HTMLElement
|
|
53
|
+
#knobImage?: HTMLElement
|
|
54
|
+
#maxKnobDistance: number
|
|
55
|
+
#moveThreshold: number
|
|
56
|
+
#idlePosition: { left: number; top: number }
|
|
57
|
+
|
|
58
|
+
// 콜백
|
|
59
|
+
#onMove: (radian: number, strength: number) => void
|
|
60
|
+
#onRelease: () => void
|
|
61
|
+
#onKeydown?: (code: string) => void
|
|
62
|
+
|
|
63
|
+
constructor(options: JoystickOptions) {
|
|
64
|
+
super()
|
|
65
|
+
|
|
66
|
+
this.#onMove = options.onMove
|
|
67
|
+
this.#onRelease = options.onRelease
|
|
68
|
+
this.#onKeydown = options.onKeyDown
|
|
69
|
+
this.#joystickImage = options.joystickImage
|
|
70
|
+
this.#knobImage = options.knobImage
|
|
71
|
+
this.#maxKnobDistance = options.maxKnobDistance ?? 80
|
|
72
|
+
this.#moveThreshold = options.moveThreshold ?? 0
|
|
73
|
+
this.#idlePosition = options.idlePosition ?? { left: -999999, top: -999999 }
|
|
74
|
+
|
|
75
|
+
window.addEventListener('keydown', this.#onKeyDown)
|
|
76
|
+
window.addEventListener('keyup', this.#onKeyUp)
|
|
77
|
+
window.addEventListener('blur', this.#onBlur)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
protected override set renderer(renderer: Renderer | undefined) {
|
|
81
|
+
const prev = super.renderer
|
|
82
|
+
if (prev) {
|
|
83
|
+
const pc = prev.container
|
|
84
|
+
pc.removeEventListener('touchstart', this.#onTouchStart)
|
|
85
|
+
pc.removeEventListener('touchmove', this.#onTouchMove)
|
|
86
|
+
pc.removeEventListener('touchend', this.#onTouchEnd)
|
|
87
|
+
pc.removeEventListener('touchcancel', this.#onTouchEnd)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
super.renderer = renderer
|
|
91
|
+
if (renderer) {
|
|
92
|
+
const c = renderer.container
|
|
93
|
+
c.addEventListener('touchstart', this.#onTouchStart, { passive: false })
|
|
94
|
+
c.addEventListener('touchmove', this.#onTouchMove, { passive: false })
|
|
95
|
+
c.addEventListener('touchend', this.#onTouchEnd)
|
|
96
|
+
c.addEventListener('touchcancel', this.#onTouchEnd)
|
|
97
|
+
|
|
98
|
+
if (this.#joystickImage) {
|
|
99
|
+
setStyle(this.#joystickImage, {
|
|
100
|
+
position: 'absolute',
|
|
101
|
+
left: `${this.#idlePosition.left}px`,
|
|
102
|
+
top: `${this.#idlePosition.top}px`,
|
|
103
|
+
zIndex: '999998',
|
|
104
|
+
transform: 'translate(-50%, -50%)',
|
|
105
|
+
pointerEvents: 'none',
|
|
106
|
+
})
|
|
107
|
+
c.appendChild(this.#joystickImage)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (this.#knobImage) {
|
|
111
|
+
setStyle(this.#knobImage, {
|
|
112
|
+
position: 'absolute',
|
|
113
|
+
left: `${this.#idlePosition.left}px`,
|
|
114
|
+
top: `${this.#idlePosition.top}px`,
|
|
115
|
+
zIndex: '999999',
|
|
116
|
+
transform: 'translate(-50%, -50%)',
|
|
117
|
+
pointerEvents: 'none',
|
|
118
|
+
})
|
|
119
|
+
c.appendChild(this.#knobImage)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
protected override get renderer() {
|
|
125
|
+
return super.renderer
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#onTouchStart = (event: TouchEvent) => {
|
|
129
|
+
if (this.paused) return
|
|
130
|
+
event.preventDefault()
|
|
131
|
+
|
|
132
|
+
if (this.#activeTouchId !== undefined) return
|
|
133
|
+
|
|
134
|
+
const touch = event.changedTouches[0]
|
|
135
|
+
this.#activeTouchId = touch.identifier
|
|
136
|
+
this.#touchStartX = touch.clientX
|
|
137
|
+
this.#touchStartY = touch.clientY
|
|
138
|
+
this.#moving = false
|
|
139
|
+
|
|
140
|
+
if (!this.renderer) return
|
|
141
|
+
|
|
142
|
+
const r = this.renderer.container.getBoundingClientRect()
|
|
143
|
+
const left = this.#touchStartX - r.left
|
|
144
|
+
const top = this.#touchStartY - r.top
|
|
145
|
+
|
|
146
|
+
setPosition(this.#joystickImage, left, top)
|
|
147
|
+
setPosition(this.#knobImage, left, top)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#onTouchMove = (event: TouchEvent) => {
|
|
151
|
+
if (this.paused) return
|
|
152
|
+
event.preventDefault()
|
|
153
|
+
|
|
154
|
+
if (this.#activeTouchId === undefined) return
|
|
155
|
+
|
|
156
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
157
|
+
const t = event.changedTouches[i]
|
|
158
|
+
if (t.identifier !== this.#activeTouchId) continue
|
|
159
|
+
|
|
160
|
+
const dx = t.clientX - this.#touchStartX
|
|
161
|
+
const dy = t.clientY - this.#touchStartY
|
|
162
|
+
|
|
163
|
+
const { x: cx, y: cy, dist } = clampVector(dx, dy, this.#maxKnobDistance)
|
|
164
|
+
|
|
165
|
+
if (this.renderer) {
|
|
166
|
+
const r = this.renderer.container.getBoundingClientRect()
|
|
167
|
+
const left = this.#touchStartX - r.left + cx
|
|
168
|
+
const top = this.#touchStartY - r.top + cy
|
|
169
|
+
setPosition(this.#knobImage, left, top)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (this.#moving || dist >= this.#moveThreshold) {
|
|
173
|
+
this.#moving = true
|
|
174
|
+
if (cx !== 0 || cy !== 0) {
|
|
175
|
+
const radian = Math.atan2(cy, cx)
|
|
176
|
+
const normalized = this.#maxKnobDistance === 0 ? 0 : dist / this.#maxKnobDistance
|
|
177
|
+
this.#onMove(radian, normalized)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
break
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#onTouchEnd = (event: TouchEvent) => {
|
|
185
|
+
if (this.paused || this.#activeTouchId === undefined) return
|
|
186
|
+
|
|
187
|
+
let ended = false
|
|
188
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
189
|
+
if (event.changedTouches[i].identifier === this.#activeTouchId) {
|
|
190
|
+
ended = true
|
|
191
|
+
break
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (!ended) return
|
|
195
|
+
|
|
196
|
+
this.#activeTouchId = undefined
|
|
197
|
+
|
|
198
|
+
// 기본 위치로 복귀
|
|
199
|
+
const { left, top } = this.#idlePosition
|
|
200
|
+
setPosition(this.#joystickImage, left, top)
|
|
201
|
+
setPosition(this.#knobImage, left, top)
|
|
202
|
+
|
|
203
|
+
if (this.#moving) {
|
|
204
|
+
this.#moving = false
|
|
205
|
+
this.#onRelease()
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
#emitFromArrowKeys() {
|
|
210
|
+
let dx = 0
|
|
211
|
+
let dy = 0
|
|
212
|
+
|
|
213
|
+
if (this.#arrowCodesPressed.has('ArrowUp')) dy -= 1
|
|
214
|
+
if (this.#arrowCodesPressed.has('ArrowDown')) dy += 1
|
|
215
|
+
if (this.#arrowCodesPressed.has('ArrowLeft')) dx -= 1
|
|
216
|
+
if (this.#arrowCodesPressed.has('ArrowRight')) dx += 1
|
|
217
|
+
|
|
218
|
+
if (dx !== 0 || dy !== 0) {
|
|
219
|
+
const radian = Math.atan2(dy, dx)
|
|
220
|
+
// 키보드: strength=1 로 일관 전달
|
|
221
|
+
this.#onMove(radian, 1)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
#onKeyDown = (event: KeyboardEvent) => {
|
|
226
|
+
if (this.paused) return
|
|
227
|
+
|
|
228
|
+
const code = event.code
|
|
229
|
+
if (this.#codesPressed.has(code)) return
|
|
230
|
+
|
|
231
|
+
this.#codesPressed.add(code)
|
|
232
|
+
this.#onKeydown?.(code)
|
|
233
|
+
|
|
234
|
+
if (isArrow(code)) {
|
|
235
|
+
const target = event.target as HTMLElement | null
|
|
236
|
+
const isEditing =
|
|
237
|
+
!!target?.closest('input, textarea, [contenteditable]:not([contenteditable="false"])')
|
|
238
|
+
if (!isEditing) event.preventDefault()
|
|
239
|
+
|
|
240
|
+
this.#arrowCodesPressed.add(code)
|
|
241
|
+
this.#emitFromArrowKeys()
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
#onKeyUp = (event: KeyboardEvent) => {
|
|
246
|
+
if (this.paused) return
|
|
247
|
+
|
|
248
|
+
const code = event.code
|
|
249
|
+
this.#codesPressed.delete(code)
|
|
250
|
+
|
|
251
|
+
if (isArrow(code)) {
|
|
252
|
+
this.#arrowCodesPressed.delete(code)
|
|
253
|
+
|
|
254
|
+
if (this.#arrowCodesPressed.size === 0) {
|
|
255
|
+
this.#onRelease()
|
|
256
|
+
} else {
|
|
257
|
+
this.#emitFromArrowKeys()
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
#onBlur = () => {
|
|
263
|
+
if (this.paused) return
|
|
264
|
+
|
|
265
|
+
// 키보드/터치 공통 릴리즈
|
|
266
|
+
this.#codesPressed.clear()
|
|
267
|
+
this.#arrowCodesPressed.clear()
|
|
268
|
+
this.#activeTouchId = undefined
|
|
269
|
+
this.#moving = false
|
|
270
|
+
|
|
271
|
+
// 기본 위치로 복귀
|
|
272
|
+
const { left, top } = this.#idlePosition
|
|
273
|
+
setPosition(this.#joystickImage, left, top)
|
|
274
|
+
setPosition(this.#knobImage, left, top)
|
|
275
|
+
|
|
276
|
+
this.#onRelease()
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
override pause() {
|
|
280
|
+
this.#onBlur()
|
|
281
|
+
super.pause()
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// 조이스틱 이미지의 기본 위치(숨김 좌표) 설정
|
|
285
|
+
setIdlePosition(p: { left: number; top: number }): void {
|
|
286
|
+
this.#idlePosition = p
|
|
287
|
+
|
|
288
|
+
// 드래그 중이면 즉시 반영하지 않음
|
|
289
|
+
if (this.#activeTouchId !== undefined) return
|
|
290
|
+
|
|
291
|
+
setPosition(this.#joystickImage, p.left, p.top)
|
|
292
|
+
setPosition(this.#knobImage, p.left, p.top)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
override remove() {
|
|
296
|
+
const renderer = this.renderer
|
|
297
|
+
if (renderer) {
|
|
298
|
+
const c = renderer.container
|
|
299
|
+
c.removeEventListener('touchstart', this.#onTouchStart)
|
|
300
|
+
c.removeEventListener('touchmove', this.#onTouchMove)
|
|
301
|
+
c.removeEventListener('touchend', this.#onTouchEnd)
|
|
302
|
+
c.removeEventListener('touchcancel', this.#onTouchEnd)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// 윈도우 리스너 정리
|
|
306
|
+
window.removeEventListener('keydown', this.#onKeyDown)
|
|
307
|
+
window.removeEventListener('keyup', this.#onKeyUp)
|
|
308
|
+
window.removeEventListener('blur', this.#onBlur)
|
|
309
|
+
|
|
310
|
+
// DOM 노드 제거
|
|
311
|
+
this.#joystickImage?.remove()
|
|
312
|
+
this.#knobImage?.remove()
|
|
313
|
+
|
|
314
|
+
super.remove()
|
|
315
|
+
}
|
|
316
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class DirtyNumber {
|
|
2
|
+
#value: number
|
|
3
|
+
#isDirty: boolean
|
|
4
|
+
|
|
5
|
+
constructor(initialValue: number) {
|
|
6
|
+
this.#value = initialValue
|
|
7
|
+
this.#isDirty = false
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get dirty() { return this.#isDirty }
|
|
11
|
+
get v() { return this.#value }
|
|
12
|
+
|
|
13
|
+
set v(newValue: number) {
|
|
14
|
+
if (this.#value !== newValue) this.#isDirty = true
|
|
15
|
+
this.#value = newValue
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
resetDirty() {
|
|
19
|
+
this.#isDirty = false
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EventEmitter, EventMap } from '@webtaku/event-emitter'
|
|
2
|
+
|
|
3
|
+
export abstract class GameNode<E extends EventMap> extends EventEmitter<E & {
|
|
4
|
+
update: (dt: number) => void
|
|
5
|
+
}> {
|
|
6
|
+
#parent?: GameNode<EventMap>
|
|
7
|
+
protected children: GameNode<EventMap>[] = [];
|
|
8
|
+
paused = false
|
|
9
|
+
|
|
10
|
+
protected set parent(parent: GameNode<EventMap> | undefined) {
|
|
11
|
+
this.#parent = parent
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
protected get parent() {
|
|
15
|
+
return this.#parent
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
add(...children: GameNode<EventMap>[]) {
|
|
19
|
+
for (const child of children) {
|
|
20
|
+
|
|
21
|
+
// 기존 부모로부터 제거
|
|
22
|
+
if (child.#parent) {
|
|
23
|
+
const idx = child.#parent.children.indexOf(child)
|
|
24
|
+
if (idx !== -1) child.#parent.children.splice(idx, 1)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 새로운 부모 설정
|
|
28
|
+
child.parent = this
|
|
29
|
+
this.children.push(child)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
remove() {
|
|
34
|
+
super.remove()
|
|
35
|
+
|
|
36
|
+
// 부모로부터 제거
|
|
37
|
+
if (this.#parent) {
|
|
38
|
+
const idx = this.#parent.children.indexOf(this)
|
|
39
|
+
if (idx !== -1) this.#parent.children.splice(idx, 1)
|
|
40
|
+
this.#parent = undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 자식 노드 제거
|
|
44
|
+
for (const child of this.children) {
|
|
45
|
+
child.parent = undefined
|
|
46
|
+
child.remove()
|
|
47
|
+
}
|
|
48
|
+
this.children.length = 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
pause() {
|
|
52
|
+
this.paused = true
|
|
53
|
+
for (const child of this.children) {
|
|
54
|
+
child.pause()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
resume() {
|
|
59
|
+
this.paused = false
|
|
60
|
+
for (const child of this.children) {
|
|
61
|
+
child.resume()
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected update(dt: number) {
|
|
66
|
+
if (this.paused) return
|
|
67
|
+
|
|
68
|
+
for (const child of this.children) {
|
|
69
|
+
if (!child.paused) child.update(dt)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
(this as any).emit('update', dt)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventMap } from '@webtaku/event-emitter'
|
|
2
|
+
import { Container as PixiContainer } from 'pixi.js'
|
|
3
|
+
import { TransformableNode, TransformableNodeOptions } from './transformable'
|
|
4
|
+
|
|
5
|
+
export type GameObjectOptions = {} & TransformableNodeOptions
|
|
6
|
+
|
|
7
|
+
export class GameObject<E extends EventMap = EventMap> extends TransformableNode<PixiContainer, E> {
|
|
8
|
+
constructor(options?: GameObjectOptions) {
|
|
9
|
+
super(new PixiContainer({ sortableChildren: true }), options ?? {})
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { EventMap } from '@webtaku/event-emitter'
|
|
2
|
+
import { Container as PixiContainer } from 'pixi.js'
|
|
3
|
+
import { Renderer } from '../../renderer/renderer'
|
|
4
|
+
import { DirtyNumber } from './dirty-number'
|
|
5
|
+
import { GameNode } from './game-node'
|
|
6
|
+
import { WorldTransform } from './transform'
|
|
7
|
+
|
|
8
|
+
export function isRenderableNode(v: unknown): v is RenderableNode<PixiContainer, EventMap> {
|
|
9
|
+
return (v as RenderableNode<PixiContainer, EventMap>).worldTransform !== undefined
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export abstract class RenderableNode<C extends PixiContainer, E extends EventMap> extends GameNode<E> {
|
|
13
|
+
#renderer?: Renderer
|
|
14
|
+
_pixiContainer: C
|
|
15
|
+
|
|
16
|
+
worldTransform = new WorldTransform()
|
|
17
|
+
worldAlpha = new DirtyNumber(1)
|
|
18
|
+
|
|
19
|
+
constructor(pixiContainer: C) {
|
|
20
|
+
super()
|
|
21
|
+
this._pixiContainer = pixiContainer
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected set renderer(renderer: Renderer | undefined) {
|
|
25
|
+
this.#renderer = renderer
|
|
26
|
+
|
|
27
|
+
for (const child of this.children) {
|
|
28
|
+
if (isRenderableNode(child)) {
|
|
29
|
+
child.renderer = renderer
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected get renderer() {
|
|
35
|
+
return this.#renderer
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
override add(...children: GameNode<EventMap>[]) {
|
|
39
|
+
super.add(...children)
|
|
40
|
+
|
|
41
|
+
for (const child of children) {
|
|
42
|
+
if (isRenderableNode(child)) {
|
|
43
|
+
this._pixiContainer.addChild(child._pixiContainer)
|
|
44
|
+
|
|
45
|
+
// 렌더러 설정
|
|
46
|
+
if (this.#renderer) child.renderer = this.#renderer
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
override remove() {
|
|
52
|
+
this._pixiContainer.destroy({ children: true })
|
|
53
|
+
super.remove()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
_updateWorldTransform() {
|
|
57
|
+
for (const child of this.children) {
|
|
58
|
+
if (isRenderableNode(child)) child._updateWorldTransform()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_resetWorldTransformDirty() {
|
|
63
|
+
for (const child of this.children) {
|
|
64
|
+
if (isRenderableNode(child)) child._resetWorldTransformDirty()
|
|
65
|
+
}
|
|
66
|
+
this.worldTransform.resetDirty()
|
|
67
|
+
this.worldAlpha.resetDirty()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
set tint(t) { this._pixiContainer.tint = t }
|
|
71
|
+
get tint() { return this._pixiContainer.tint }
|
|
72
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { DirtyNumber } from './dirty-number'
|
|
2
|
+
|
|
3
|
+
export class LocalTransform {
|
|
4
|
+
x = 0
|
|
5
|
+
y = 0
|
|
6
|
+
scaleX = 1
|
|
7
|
+
scaleY = 1
|
|
8
|
+
pivotX = 0
|
|
9
|
+
pivotY = 0
|
|
10
|
+
|
|
11
|
+
#rotation = 0
|
|
12
|
+
#cos = 1
|
|
13
|
+
#sin = 0
|
|
14
|
+
|
|
15
|
+
get cos() { return this.#cos }
|
|
16
|
+
get sin() { return this.#sin }
|
|
17
|
+
get rotation() { return this.#rotation }
|
|
18
|
+
|
|
19
|
+
set rotation(v) {
|
|
20
|
+
if (this.#rotation !== v) {
|
|
21
|
+
this.#rotation = v
|
|
22
|
+
this.#cos = Math.cos(v)
|
|
23
|
+
this.#sin = Math.sin(v)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class WorldTransform {
|
|
29
|
+
x = new DirtyNumber(NaN)
|
|
30
|
+
y = new DirtyNumber(NaN)
|
|
31
|
+
scaleX = new DirtyNumber(1)
|
|
32
|
+
scaleY = new DirtyNumber(1)
|
|
33
|
+
rotation = new DirtyNumber(0)
|
|
34
|
+
cos = 1
|
|
35
|
+
sin = 0
|
|
36
|
+
|
|
37
|
+
update(parent: WorldTransform, local: LocalTransform) {
|
|
38
|
+
const rx = local.x * parent.scaleX.v
|
|
39
|
+
const ry = local.y * parent.scaleY.v
|
|
40
|
+
const pCos = parent.cos
|
|
41
|
+
const pSin = parent.sin
|
|
42
|
+
|
|
43
|
+
this.scaleX.v = parent.scaleX.v * local.scaleX
|
|
44
|
+
this.scaleY.v = parent.scaleY.v * local.scaleY
|
|
45
|
+
|
|
46
|
+
const pivotX = local.pivotX * this.scaleX.v
|
|
47
|
+
const pivotY = local.pivotY * this.scaleY.v
|
|
48
|
+
|
|
49
|
+
// 로컬 회전
|
|
50
|
+
const lCos = local.cos
|
|
51
|
+
const lSin = local.sin
|
|
52
|
+
// 월드 회전(부모+자식) cos/sin — 덧셈정리
|
|
53
|
+
const wCos = pCos * lCos - pSin * lSin
|
|
54
|
+
const wSin = pSin * lCos + pCos * lSin
|
|
55
|
+
|
|
56
|
+
// 위치: 부모 회전으로 (rx,ry) 회전 + 월드 회전으로 피벗 보정
|
|
57
|
+
this.x.v = parent.x.v + (rx * pCos - ry * pSin) - (pivotX * wCos - pivotY * wSin)
|
|
58
|
+
this.y.v = parent.y.v + (rx * pSin + ry * pCos) - (pivotX * wSin + pivotY * wCos)
|
|
59
|
+
|
|
60
|
+
// 회전(스칼라 값)
|
|
61
|
+
const rot = parent.rotation.v + local.rotation
|
|
62
|
+
this.rotation.v = rot
|
|
63
|
+
this.cos = wCos
|
|
64
|
+
this.sin = wSin
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get dirty() {
|
|
68
|
+
return this.x.dirty ||
|
|
69
|
+
this.y.dirty ||
|
|
70
|
+
this.scaleX.dirty ||
|
|
71
|
+
this.scaleY.dirty ||
|
|
72
|
+
this.rotation.dirty
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
resetDirty() {
|
|
76
|
+
this.x.resetDirty()
|
|
77
|
+
this.y.resetDirty()
|
|
78
|
+
this.scaleX.resetDirty()
|
|
79
|
+
this.scaleY.resetDirty()
|
|
80
|
+
this.rotation.resetDirty()
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { EventMap } from '@webtaku/event-emitter'
|
|
2
|
+
import { Container as PixiContainer } from 'pixi.js'
|
|
3
|
+
import { Renderer } from '../../renderer/renderer'
|
|
4
|
+
import { isRenderableNode, RenderableNode } from './renderable'
|
|
5
|
+
import { LocalTransform } from './transform'
|
|
6
|
+
|
|
7
|
+
export type TransformableNodeOptions = {
|
|
8
|
+
x?: number
|
|
9
|
+
y?: number
|
|
10
|
+
scale?: number
|
|
11
|
+
scaleX?: number
|
|
12
|
+
scaleY?: number
|
|
13
|
+
pivotX?: number
|
|
14
|
+
pivotY?: number
|
|
15
|
+
rotation?: number
|
|
16
|
+
|
|
17
|
+
alpha?: number
|
|
18
|
+
layer?: string
|
|
19
|
+
useYSort?: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export abstract class TransformableNode<C extends PixiContainer, E extends EventMap> extends RenderableNode<C, E> {
|
|
23
|
+
protected localTransform = new LocalTransform()
|
|
24
|
+
|
|
25
|
+
alpha = 1
|
|
26
|
+
#layer?: string
|
|
27
|
+
#useYSort = false
|
|
28
|
+
|
|
29
|
+
constructor(pixiContainer: C, options: TransformableNodeOptions) {
|
|
30
|
+
super(pixiContainer)
|
|
31
|
+
|
|
32
|
+
if (options.x !== undefined) this.x = options.x
|
|
33
|
+
if (options.y !== undefined) this.y = options.y
|
|
34
|
+
if (options.scale !== undefined) this.scale = options.scale
|
|
35
|
+
if (options.scaleX !== undefined) this.scaleX = options.scaleX
|
|
36
|
+
if (options.scaleY !== undefined) this.scaleY = options.scaleY
|
|
37
|
+
if (options.pivotX !== undefined) this.pivotX = options.pivotX
|
|
38
|
+
if (options.pivotY !== undefined) this.pivotY = options.pivotY
|
|
39
|
+
if (options.rotation !== undefined) this.rotation = options.rotation
|
|
40
|
+
if (options.alpha !== undefined) this.alpha = options.alpha
|
|
41
|
+
|
|
42
|
+
this.#layer = options.layer
|
|
43
|
+
this.#useYSort = options.useYSort ?? false
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
protected override set renderer(renderer: Renderer | undefined) {
|
|
47
|
+
super.renderer = renderer
|
|
48
|
+
|
|
49
|
+
if (this.#layer && renderer) {
|
|
50
|
+
renderer._addToLayer(this, this.#layer)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected override get renderer() {
|
|
55
|
+
return super.renderer
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override _updateWorldTransform() {
|
|
59
|
+
const parent = this.parent
|
|
60
|
+
if (parent && isRenderableNode(parent)) {
|
|
61
|
+
this.worldTransform.update(parent.worldTransform, this.localTransform)
|
|
62
|
+
this.worldAlpha.v = parent.worldAlpha.v * this.alpha
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const pc = this._pixiContainer
|
|
66
|
+
const renderer = this.renderer
|
|
67
|
+
|
|
68
|
+
// 레이어 상에 있는 경우, 독립적으로 업데이트
|
|
69
|
+
if (this.#layer && renderer) {
|
|
70
|
+
const wt = this.worldTransform
|
|
71
|
+
pc.position.set(wt.x.v, wt.y.v)
|
|
72
|
+
pc.scale.set(wt.scaleX.v, wt.scaleY.v)
|
|
73
|
+
pc.rotation = wt.rotation.v
|
|
74
|
+
pc.alpha = this.worldAlpha.v
|
|
75
|
+
} else {
|
|
76
|
+
const lt = this.localTransform
|
|
77
|
+
pc.position.set(lt.x, lt.y)
|
|
78
|
+
if (this.#useYSort) pc.zIndex = lt.y
|
|
79
|
+
pc.pivot.set(lt.pivotX, lt.pivotY)
|
|
80
|
+
pc.scale.set(lt.scaleX, lt.scaleY)
|
|
81
|
+
pc.rotation = lt.rotation
|
|
82
|
+
pc.alpha = this.alpha
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
super._updateWorldTransform()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
set x(v) { this.localTransform.x = v }
|
|
89
|
+
get x() { return this.localTransform.x }
|
|
90
|
+
|
|
91
|
+
set y(v) { this.localTransform.y = v }
|
|
92
|
+
get y() { return this.localTransform.y }
|
|
93
|
+
|
|
94
|
+
set scale(v) { this.localTransform.scaleX = v; this.localTransform.scaleY = v }
|
|
95
|
+
get scale() { return this.localTransform.scaleX }
|
|
96
|
+
|
|
97
|
+
set scaleX(v) { this.localTransform.scaleX = v }
|
|
98
|
+
get scaleX() { return this.localTransform.scaleX }
|
|
99
|
+
|
|
100
|
+
set scaleY(v) { this.localTransform.scaleY = v }
|
|
101
|
+
get scaleY() { return this.localTransform.scaleY }
|
|
102
|
+
|
|
103
|
+
set pivotX(v) { this.localTransform.pivotX = v }
|
|
104
|
+
get pivotX() { return this.localTransform.pivotX }
|
|
105
|
+
|
|
106
|
+
set pivotY(v) { this.localTransform.pivotY = v }
|
|
107
|
+
get pivotY() { return this.localTransform.pivotY }
|
|
108
|
+
|
|
109
|
+
set rotation(v) { this.localTransform.rotation = v }
|
|
110
|
+
get rotation() { return this.localTransform.rotation }
|
|
111
|
+
}
|