kiwiengine 0.0.1-alpha → 0.5.2
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/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.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 +38 -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/flappy-cat/assets/bgm/bgm.ogg +0 -0
- package/examples/flappy-cat/assets/images/base.png +0 -0
- package/examples/flappy-cat/assets/images/bg.png +0 -0
- package/examples/flappy-cat/assets/images/cat.png +0 -0
- package/examples/flappy-cat/assets/images/pipe-green.png +0 -0
- package/examples/flappy-cat/assets/images/pipe-red.png +0 -0
- package/examples/flappy-cat/assets/sfx/die.wav +0 -0
- package/examples/flappy-cat/assets/sfx/hit.wav +0 -0
- package/examples/flappy-cat/assets/sfx/point.wav +0 -0
- package/examples/flappy-cat/assets/sfx/wing.wav +0 -0
- package/examples/flappy-cat/dist/game.js +0 -0
- package/examples/flappy-cat/index.html +24 -0
- package/examples/flappy-cat/index.ts +0 -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 +289 -0
- package/examples/simple-battle/assets/spritesheets/hero.png +0 -0
- package/examples/simple-battle/assets/spritesheets/orc-atlas.json +289 -0
- package/examples/simple-battle/assets/spritesheets/orc.png +0 -0
- package/examples/simple-battle/assets/spritesheets/potion-atlas.json +83 -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 +45 -0
- package/examples/simple-battle/hud/heal-text.ts +45 -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 +113 -0
- package/examples/simple-battle/objects/orc.ts +109 -0
- package/examples/simple-battle/objects/potion.ts +29 -0
- package/examples/simple-battle/stage.ts +176 -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 +41 -0
- package/examples/tsconfig.json +2 -1
- package/examples/webpack.config.js +14 -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 +3 -3
- package/lib/asset/loaders/audio.js.map +1 -1
- package/lib/asset/loaders/binary.js +3 -3
- package/lib/asset/loaders/binary.js.map +1 -1
- package/lib/asset/loaders/bitmap-font.js +71 -0
- package/lib/asset/loaders/bitmap-font.js.map +1 -0
- package/lib/asset/loaders/font.js +1 -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 +6 -7
- package/lib/asset/loaders/spritesheet.js.map +1 -1
- package/lib/asset/loaders/text.js +3 -3
- package/lib/asset/loaders/text.js.map +1 -1
- package/lib/asset/loaders/texture.js +5 -4
- 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 +121 -0
- package/lib/dom/dom-animated-sprite.js.map +1 -0
- package/lib/dom/dom-game-object.js +106 -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 +35 -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 +38 -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 +52 -0
- package/lib/node/core/renderable.js.map +1 -0
- package/lib/node/core/transform.js +59 -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 +96 -0
- package/lib/node/ext/animated-sprite.js.map +1 -0
- package/lib/node/ext/bitmap-text.js +89 -0
- package/lib/node/ext/bitmap-text.js.map +1 -0
- package/lib/node/ext/circle.js +28 -0
- package/lib/node/ext/circle.js.map +1 -0
- package/lib/node/ext/deplay.js +20 -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 +20 -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 +32 -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 +112 -0
- package/lib/node/physics/physics-object.js.map +1 -0
- package/lib/node/physics/physics-world.js +27 -0
- package/lib/node/physics/physics-world.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 +145 -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/asset/audio.d.ts +5 -4
- package/lib/types/asset/audio.d.ts.map +1 -1
- package/lib/types/asset/loaders/audio.d.ts +1 -1
- package/lib/types/asset/loaders/audio.d.ts.map +1 -1
- package/lib/types/asset/loaders/binary.d.ts +1 -1
- package/lib/types/asset/loaders/binary.d.ts.map +1 -1
- package/lib/types/asset/loaders/bitmap-font.d.ts +16 -0
- package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -0
- package/lib/types/asset/loaders/font.d.ts +1 -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 +5 -5
- package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
- package/lib/types/asset/loaders/text.d.ts +1 -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 +5 -3
- package/lib/types/asset/preload.d.ts.map +1 -1
- 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 +29 -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 +25 -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 +17 -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 +22 -0
- package/lib/types/node/core/renderable.d.ts.map +1 -0
- package/lib/types/node/core/transform.d.ts +25 -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 +28 -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/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/types/bitmap-font.d.ts +18 -0
- package/lib/types/types/bitmap-font.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 +19 -19
- package/src/asset/loaders/binary.ts +16 -16
- package/src/asset/loaders/bitmap-font.ts +85 -0
- package/src/asset/loaders/font.ts +14 -14
- package/src/asset/loaders/loader.ts +27 -23
- package/src/asset/loaders/spritesheet.ts +34 -36
- package/src/asset/loaders/text.ts +15 -15
- package/src/asset/loaders/texture.ts +29 -28
- package/src/asset/preload.ts +75 -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 +153 -0
- package/src/dom/dom-game-object.ts +131 -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 +46 -13
- package/src/input/joystick.ts +316 -0
- package/src/node/core/dirty-number.ts +45 -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 +65 -0
- package/src/node/core/transform.ts +70 -0
- package/src/node/core/transformable.ts +111 -0
- package/src/node/ext/animated-sprite.ts +123 -0
- package/src/node/ext/bitmap-text.ts +109 -0
- package/src/node/ext/circle.ts +40 -0
- package/src/node/ext/deplay.ts +24 -0
- package/src/node/ext/dom-container.ts +62 -0
- package/src/node/ext/interval.ts +24 -0
- package/src/node/ext/particle.ts +142 -0
- package/src/node/ext/rectangle.ts +51 -0
- package/src/node/ext/spine.ts +323 -0
- package/src/node/ext/sprite.ts +53 -0
- package/src/node/physics/physics-object.ts +156 -0
- package/src/node/physics/physics-world.ts +40 -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 +180 -0
- package/src/renderer/ticker.test.ts +325 -0
- package/src/renderer/ticker.ts +54 -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 → collision-test}/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,121 @@
|
|
|
1
|
+
import { DomGameObject } from './dom-game-object';
|
|
2
|
+
import { domTextureLoader } from './dom-texture-loader';
|
|
3
|
+
import { setStyle } from './dom-utils';
|
|
4
|
+
export class DomAnimatedSpriteNode extends DomGameObject {
|
|
5
|
+
#src;
|
|
6
|
+
#atlas;
|
|
7
|
+
#animation;
|
|
8
|
+
#fps;
|
|
9
|
+
#loop;
|
|
10
|
+
#frames = [];
|
|
11
|
+
#frameDuration;
|
|
12
|
+
#textureScale = 1;
|
|
13
|
+
#elapsedTime = 0;
|
|
14
|
+
#currentFrameIdx = 0;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super(options);
|
|
17
|
+
this.#src = options.src;
|
|
18
|
+
this.#atlas = options.atlas;
|
|
19
|
+
this.#animation = options.animation;
|
|
20
|
+
this.#fps = options.fps;
|
|
21
|
+
this.#loop = options.loop ?? true;
|
|
22
|
+
this.#load();
|
|
23
|
+
}
|
|
24
|
+
async #load() {
|
|
25
|
+
let texture;
|
|
26
|
+
if (domTextureLoader.checkCached(this.#src)) {
|
|
27
|
+
texture = domTextureLoader.getCached(this.#src);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.info(`Dom texture not preloaded. Loading now: ${this.#src}`);
|
|
31
|
+
texture = await domTextureLoader.load(this.#src);
|
|
32
|
+
}
|
|
33
|
+
const S = this.#atlas.meta.scale === 'auto' ? 1 : Number(this.#atlas.meta.scale);
|
|
34
|
+
this.#frameDuration = 1 / this.#fps;
|
|
35
|
+
this.#frames = this.#atlas.animations?.[this.#animation] ?? [];
|
|
36
|
+
this.#textureScale = S;
|
|
37
|
+
const frameName = this.#frames[this.#currentFrameIdx];
|
|
38
|
+
const frame = this.#atlas.frames[frameName].frame;
|
|
39
|
+
setStyle(this.el, !frameName || !texture ? { backgroundImage: 'none' } : {
|
|
40
|
+
backgroundImage: `url(${this.#src})`,
|
|
41
|
+
width: `${frame.w * S}px`,
|
|
42
|
+
height: `${frame.h * S}px`,
|
|
43
|
+
backgroundSize: `${texture.width * S}px ${texture.height * S}px`,
|
|
44
|
+
backgroundPosition: `-${frame.x * S}px -${frame.y * S}px`
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
render(dt) {
|
|
48
|
+
super.render(dt);
|
|
49
|
+
if (this.#frameDuration === undefined || this.#frames.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
const lastIndex = this.#frames.length - 1;
|
|
52
|
+
if (!this.#loop && this.#currentFrameIdx === lastIndex)
|
|
53
|
+
return;
|
|
54
|
+
this.#elapsedTime += dt;
|
|
55
|
+
if (this.#elapsedTime < this.#frameDuration)
|
|
56
|
+
return;
|
|
57
|
+
while (this.#elapsedTime >= this.#frameDuration) {
|
|
58
|
+
this.#elapsedTime -= this.#frameDuration;
|
|
59
|
+
if (this.#currentFrameIdx === lastIndex) {
|
|
60
|
+
this.emit('animationend', this.#animation);
|
|
61
|
+
if (this.#loop) {
|
|
62
|
+
this.#currentFrameIdx = 0;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.#elapsedTime = 0;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.#currentFrameIdx++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const S = this.#textureScale;
|
|
74
|
+
const frameName = this.#frames[this.#currentFrameIdx];
|
|
75
|
+
const frame = this.#atlas.frames[frameName].frame;
|
|
76
|
+
setStyle(this.el, {
|
|
77
|
+
width: `${frame.w * S}px`,
|
|
78
|
+
height: `${frame.h * S}px`,
|
|
79
|
+
backgroundPosition: `-${frame.x * S}px -${frame.y * S}px`
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
set src(src) {
|
|
83
|
+
if (this.#src !== src) {
|
|
84
|
+
domTextureLoader.release(this.#src);
|
|
85
|
+
this.#src = src;
|
|
86
|
+
this.#load();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
get src() { return this.#src; }
|
|
90
|
+
set atlas(atlas) {
|
|
91
|
+
if (this.#atlas !== atlas) {
|
|
92
|
+
domTextureLoader.release(this.#src);
|
|
93
|
+
this.#atlas = atlas;
|
|
94
|
+
this.#load();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
get atlas() { return this.#atlas; }
|
|
98
|
+
set animation(animation) {
|
|
99
|
+
if (this.#animation !== animation) {
|
|
100
|
+
this.#animation = animation;
|
|
101
|
+
this.#frames = this.#atlas.animations?.[animation] ?? [];
|
|
102
|
+
this.#currentFrameIdx = 0;
|
|
103
|
+
this.#elapsedTime = 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
get animation() { return this.#animation; }
|
|
107
|
+
set fps(fps) {
|
|
108
|
+
if (this.#fps !== fps) {
|
|
109
|
+
this.#fps = fps;
|
|
110
|
+
this.#frameDuration = 1 / fps;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
get fps() { return this.#fps; }
|
|
114
|
+
set loop(loop) { this.#loop = loop; }
|
|
115
|
+
get loop() { return this.#loop; }
|
|
116
|
+
remove() {
|
|
117
|
+
domTextureLoader.release(this.#src);
|
|
118
|
+
super.remove();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=dom-animated-sprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-animated-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-animated-sprite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAUtC,MAAM,OAAO,qBAAqD,SAAQ,aAExE;IACA,IAAI,CAAQ;IACZ,MAAM,CAAiB;IACvB,UAAU,CAAQ;IAClB,IAAI,CAAQ;IACZ,KAAK,CAAS;IAEd,OAAO,GAAa,EAAE,CAAA;IACtB,cAAc,CAAS;IACvB,aAAa,GAAG,CAAC,CAAA;IACjB,YAAY,GAAG,CAAC,CAAA;IAChB,gBAAgB,GAAG,CAAC,CAAA;IAEpB,YAAY,OAAqC;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAA;QACjC,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEhF,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QAC9D,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAA;QAEjD,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;YACpC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;YACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;YAC1B,cAAc,EAAE,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI;YAChE,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;SAC1D,CAAC,CAAA;IACJ,CAAC;IAEQ,MAAM,CAAC,EAAU;QACxB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAEhB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE1E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAM;QAE9D,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QACvB,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc;YAAE,OAAM;QAEnD,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAA;YAExC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;gBAEnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;gBAC3B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;oBACrB,MAAK;gBACP,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAA;QAEjD,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE;YAChB,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;YACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;YAC1B,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI;SAC1D,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,KAAK;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAA,CAAC,CAAC;IAElC,IAAI,SAAS,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;YACxD,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;YACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC;IAE1C,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,GAAG,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAE9B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;IAEvB,MAAM;QACb,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { SpritesheetData } from 'pixi.js'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomAnimatedSpriteNodeOptions = {\n src: string\n atlas: SpritesheetData\n animation: string\n fps: number\n loop?: boolean\n} & DomGameObjectOptions\n\nexport class DomAnimatedSpriteNode<E extends EventMap = EventMap> extends DomGameObject<E & {\n animationend: (animation: string) => void\n}> {\n #src: string\n #atlas: SpritesheetData\n #animation: string\n #fps: number\n #loop: boolean\n\n #frames: string[] = []\n #frameDuration?: number\n #textureScale = 1\n #elapsedTime = 0\n #currentFrameIdx = 0\n\n constructor(options: DomAnimatedSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#atlas = options.atlas\n this.#animation = options.animation\n this.#fps = options.fps\n this.#loop = options.loop ?? true\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n const S = this.#atlas.meta.scale === 'auto' ? 1 : Number(this.#atlas.meta.scale)\n\n this.#frameDuration = 1 / this.#fps\n this.#frames = this.#atlas.animations?.[this.#animation] ?? []\n this.#textureScale = S\n\n const frameName = this.#frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName].frame\n\n setStyle(this.el, !frameName || !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${frame.w * S}px`,\n height: `${frame.h * S}px`,\n backgroundSize: `${texture.width * S}px ${texture.height * S}px`,\n backgroundPosition: `-${frame.x * S}px -${frame.y * S}px`\n })\n }\n\n override render(dt: number) {\n super.render(dt)\n\n if (this.#frameDuration === undefined || this.#frames.length === 0) return\n\n const lastIndex = this.#frames.length - 1\n if (!this.#loop && this.#currentFrameIdx === lastIndex) return\n\n this.#elapsedTime += dt\n if (this.#elapsedTime < this.#frameDuration) return\n\n while (this.#elapsedTime >= this.#frameDuration) {\n this.#elapsedTime -= this.#frameDuration\n\n if (this.#currentFrameIdx === lastIndex) {\n (this as any).emit('animationend', this.#animation)\n\n if (this.#loop) {\n this.#currentFrameIdx = 0\n } else {\n this.#elapsedTime = 0\n break\n }\n } else {\n this.#currentFrameIdx++\n }\n }\n\n const S = this.#textureScale\n const frameName = this.#frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName].frame\n\n setStyle(this.el, {\n width: `${frame.w * S}px`,\n height: `${frame.h * S}px`,\n backgroundPosition: `-${frame.x * S}px -${frame.y * S}px`\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n domTextureLoader.release(this.#src)\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#frames = this.#atlas.animations?.[animation] ?? []\n this.#currentFrameIdx = 0\n this.#elapsedTime = 0\n }\n }\n\n get animation() { return this.#animation }\n\n set fps(fps) {\n if (this.#fps !== fps) {\n this.#fps = fps\n this.#frameDuration = 1 / fps\n }\n }\n\n get fps() { return this.#fps }\n\n set loop(loop) { this.#loop = loop }\n get loop() { return this.#loop }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { DirtyNumber } from '../node/core/dirty-number';
|
|
2
|
+
import { GameNode } from '../node/core/game-node';
|
|
3
|
+
import { isRenderableNode } from '../node/core/renderable';
|
|
4
|
+
import { LocalTransform, WorldTransform } from '../node/core/transform';
|
|
5
|
+
import { setStyle } from './dom-utils';
|
|
6
|
+
class DomRootNode extends GameNode {
|
|
7
|
+
worldTransform = new WorldTransform();
|
|
8
|
+
worldAlpha = new DirtyNumber(1);
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
this.worldTransform.x.v = 0;
|
|
12
|
+
this.worldTransform.y.v = 0;
|
|
13
|
+
this.worldTransform.resetDirty();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class DomGameObject extends GameNode {
|
|
17
|
+
el = document.createElement('div');
|
|
18
|
+
#localTransform = new LocalTransform();
|
|
19
|
+
worldTransform = new WorldTransform();
|
|
20
|
+
alpha = 1;
|
|
21
|
+
worldAlpha = new DirtyNumber(1);
|
|
22
|
+
#useYSort = false;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super();
|
|
25
|
+
setStyle(this.el, {
|
|
26
|
+
position: 'absolute',
|
|
27
|
+
left: '50%',
|
|
28
|
+
top: '50%',
|
|
29
|
+
zIndex: '1',
|
|
30
|
+
transform: 'translate(-50%, -50%)',
|
|
31
|
+
});
|
|
32
|
+
if (options) {
|
|
33
|
+
if (options.x !== undefined)
|
|
34
|
+
this.x = options.x;
|
|
35
|
+
if (options.y !== undefined)
|
|
36
|
+
this.y = options.y;
|
|
37
|
+
if (options.scale !== undefined)
|
|
38
|
+
this.scale = options.scale;
|
|
39
|
+
if (options.scaleX !== undefined)
|
|
40
|
+
this.scaleX = options.scaleX;
|
|
41
|
+
if (options.scaleY !== undefined)
|
|
42
|
+
this.scaleY = options.scaleY;
|
|
43
|
+
if (options.pivotX !== undefined)
|
|
44
|
+
this.pivotX = options.pivotX;
|
|
45
|
+
if (options.pivotY !== undefined)
|
|
46
|
+
this.pivotY = options.pivotY;
|
|
47
|
+
if (options.rotation !== undefined)
|
|
48
|
+
this.rotation = options.rotation;
|
|
49
|
+
if (options.alpha !== undefined)
|
|
50
|
+
this.alpha = options.alpha;
|
|
51
|
+
this.#useYSort = options.useYSort ?? false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
render(dt) {
|
|
55
|
+
this.update(dt);
|
|
56
|
+
this._updateWorldTransform();
|
|
57
|
+
}
|
|
58
|
+
_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
|
+
if (this.worldTransform.dirty) {
|
|
65
|
+
const wt = this.worldTransform;
|
|
66
|
+
this.el.style.transform = `
|
|
67
|
+
translate(
|
|
68
|
+
calc(-50% + ${wt.x.v}px),
|
|
69
|
+
calc(-50% + ${wt.y.v}px)
|
|
70
|
+
)
|
|
71
|
+
scale(${wt.scaleX.v}, ${wt.scaleY.v})
|
|
72
|
+
rotate(${wt.rotation.v}rad)
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
if (this.worldAlpha.dirty)
|
|
76
|
+
this.el.style.opacity = this.worldAlpha.v.toString();
|
|
77
|
+
for (const child of this.children) {
|
|
78
|
+
if (isRenderableNode(child))
|
|
79
|
+
child._updateWorldTransform();
|
|
80
|
+
}
|
|
81
|
+
this.worldTransform.resetDirty();
|
|
82
|
+
}
|
|
83
|
+
attachTo(target) {
|
|
84
|
+
target.appendChild(this.el);
|
|
85
|
+
this.parent = new DomRootNode();
|
|
86
|
+
this._updateWorldTransform();
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
set x(v) { this.#localTransform.x = v; }
|
|
90
|
+
get x() { return this.#localTransform.x; }
|
|
91
|
+
set y(v) { this.#localTransform.y = v; }
|
|
92
|
+
get y() { return this.#localTransform.y; }
|
|
93
|
+
set scale(v) { this.#localTransform.scaleX = v; this.#localTransform.scaleY = v; }
|
|
94
|
+
get scale() { return this.#localTransform.scaleX; }
|
|
95
|
+
set scaleX(v) { this.#localTransform.scaleX = v; }
|
|
96
|
+
get scaleX() { return this.#localTransform.scaleX; }
|
|
97
|
+
set scaleY(v) { this.#localTransform.scaleY = v; }
|
|
98
|
+
get scaleY() { return this.#localTransform.scaleY; }
|
|
99
|
+
set pivotX(v) { this.#localTransform.pivotX = v; }
|
|
100
|
+
get pivotX() { return this.#localTransform.pivotX; }
|
|
101
|
+
set pivotY(v) { this.#localTransform.pivotY = v; }
|
|
102
|
+
get pivotY() { return this.#localTransform.pivotY; }
|
|
103
|
+
set rotation(v) { this.#localTransform.rotation = v; }
|
|
104
|
+
get rotation() { return this.#localTransform.rotation; }
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=dom-game-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-game-object.js","sourceRoot":"","sources":["../../src/dom/dom-game-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DirtyNumber } from '../node/core/dirty-number'\nimport { GameNode } from '../node/core/game-node'\nimport { isRenderableNode } from '../node/core/renderable'\nimport { LocalTransform, WorldTransform } from '../node/core/transform'\nimport { setStyle } from './dom-utils'\n\nexport type DomGameObjectOptions = {\n x?: number\n y?: number\n scale?: number\n scaleX?: number\n scaleY?: number\n pivotX?: number\n pivotY?: number\n rotation?: number\n\n alpha?: number\n useYSort?: boolean\n}\n\nclass DomRootNode extends GameNode<EventMap> {\n worldTransform = new WorldTransform()\n worldAlpha = new DirtyNumber(1)\n\n constructor() {\n super()\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n }\n}\n\nexport class DomGameObject<E extends EventMap = EventMap> extends GameNode<E> {\n protected el = document.createElement('div')\n\n #localTransform = new LocalTransform()\n worldTransform = new WorldTransform()\n alpha = 1\n worldAlpha = new DirtyNumber(1)\n #useYSort = false\n\n constructor(options?: DomGameObjectOptions) {\n super()\n\n setStyle(this.el, {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: '1',\n transform: 'translate(-50%, -50%)',\n })\n\n if (options) {\n if (options.x !== undefined) this.x = options.x\n if (options.y !== undefined) this.y = options.y\n if (options.scale !== undefined) this.scale = options.scale\n if (options.scaleX !== undefined) this.scaleX = options.scaleX\n if (options.scaleY !== undefined) this.scaleY = options.scaleY\n if (options.pivotX !== undefined) this.pivotX = options.pivotX\n if (options.pivotY !== undefined) this.pivotY = options.pivotY\n if (options.rotation !== undefined) this.rotation = options.rotation\n if (options.alpha !== undefined) this.alpha = options.alpha\n\n this.#useYSort = options.useYSort ?? false\n }\n }\n\n render(dt: number) {\n this.update(dt)\n this._updateWorldTransform()\n }\n\n protected _updateWorldTransform() {\n const parent = this.parent\n if (parent && isRenderableNode(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n this.worldAlpha.v = parent.worldAlpha.v * this.alpha\n }\n\n if (this.worldTransform.dirty) {\n const wt = this.worldTransform\n\n this.el.style.transform = `\n translate(\n calc(-50% + ${wt.x.v}px),\n calc(-50% + ${wt.y.v}px)\n )\n scale(${wt.scaleX.v}, ${wt.scaleY.v})\n rotate(${wt.rotation.v}rad)\n `\n }\n if (this.worldAlpha.dirty) this.el.style.opacity = this.worldAlpha.v.toString()\n\n for (const child of this.children) {\n if (isRenderableNode(child)) child._updateWorldTransform()\n }\n this.worldTransform.resetDirty()\n }\n\n attachTo(target: HTMLElement) {\n target.appendChild(this.el)\n this.parent = new DomRootNode()\n this._updateWorldTransform()\n return this\n }\n\n set x(v) { this.#localTransform.x = v }\n get x() { return this.#localTransform.x }\n\n set y(v) { this.#localTransform.y = v }\n get y() { return this.#localTransform.y }\n\n set scale(v) { this.#localTransform.scaleX = v; this.#localTransform.scaleY = v }\n get scale() { return this.#localTransform.scaleX }\n\n set scaleX(v) { this.#localTransform.scaleX = v }\n get scaleX() { return this.#localTransform.scaleX }\n\n set scaleY(v) { this.#localTransform.scaleY = v }\n get scaleY() { return this.#localTransform.scaleY }\n\n set pivotX(v) { this.#localTransform.pivotX = v }\n get pivotX() { return this.#localTransform.pivotX }\n\n set pivotY(v) { this.#localTransform.pivotY = v }\n get pivotY() { return this.#localTransform.pivotY }\n\n set rotation(v) { this.#localTransform.rotation = v }\n get rotation() { return this.#localTransform.rotation }\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { DomGameObject } from './dom-game-object';
|
|
2
|
+
import { domTextureLoader } from './dom-texture-loader';
|
|
3
|
+
import { setStyle } from './dom-utils';
|
|
4
|
+
function random(min, max) {
|
|
5
|
+
return Math.random() * (max - min) + min;
|
|
6
|
+
}
|
|
7
|
+
export class DomParticleSystem extends DomGameObject {
|
|
8
|
+
#textureSrc;
|
|
9
|
+
#count;
|
|
10
|
+
#lifespan;
|
|
11
|
+
#angle;
|
|
12
|
+
#velocity;
|
|
13
|
+
#scale;
|
|
14
|
+
#startAlpha;
|
|
15
|
+
#fadeRate;
|
|
16
|
+
#orientToVelocity;
|
|
17
|
+
#blendMode;
|
|
18
|
+
#texture;
|
|
19
|
+
#loadTexturePromise;
|
|
20
|
+
#particles = [];
|
|
21
|
+
constructor(options) {
|
|
22
|
+
super(options);
|
|
23
|
+
this.el.style.pointerEvents = 'none';
|
|
24
|
+
this.#textureSrc = options.texture;
|
|
25
|
+
this.#count = options.count;
|
|
26
|
+
this.#lifespan = options.lifespan;
|
|
27
|
+
this.#angle = options.angle;
|
|
28
|
+
this.#velocity = options.velocity;
|
|
29
|
+
this.#scale = options.particleScale;
|
|
30
|
+
this.#startAlpha = options.startAlpha;
|
|
31
|
+
this.#fadeRate = options.fadeRate;
|
|
32
|
+
this.#orientToVelocity = options.orientToVelocity;
|
|
33
|
+
this.#blendMode = options.blendMode;
|
|
34
|
+
this.#loadTexturePromise = this.#loadTexture();
|
|
35
|
+
}
|
|
36
|
+
async #loadTexture() {
|
|
37
|
+
if (domTextureLoader.checkCached(this.#textureSrc)) {
|
|
38
|
+
this.#texture = domTextureLoader.getCached(this.#textureSrc);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.info(`Dom texture not preloaded. Loading now: ${this.#textureSrc}`);
|
|
42
|
+
this.#texture = await domTextureLoader.load(this.#textureSrc);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async burst({ x, y }) {
|
|
46
|
+
if (!this.#texture)
|
|
47
|
+
await this.#loadTexturePromise;
|
|
48
|
+
const count = random(this.#count.min, this.#count.max);
|
|
49
|
+
for (let i = 0; i < count; i++) {
|
|
50
|
+
const lifespan = random(this.#lifespan.min, this.#lifespan.max);
|
|
51
|
+
const angle = random(this.#angle.min, this.#angle.max);
|
|
52
|
+
const sin = Math.sin(angle);
|
|
53
|
+
const cos = Math.cos(angle);
|
|
54
|
+
const velocity = random(this.#velocity.min, this.#velocity.max);
|
|
55
|
+
const scale = random(this.#scale.min, this.#scale.max);
|
|
56
|
+
const el = document.createElement('div');
|
|
57
|
+
setStyle(el, {
|
|
58
|
+
position: 'absolute',
|
|
59
|
+
left: `${x}px`,
|
|
60
|
+
top: `${y}px`,
|
|
61
|
+
width: `${this.#texture.width}px`,
|
|
62
|
+
height: `${this.#texture.height}px`,
|
|
63
|
+
transform: `translate(-50%, -50%) scale(${scale})${this.#orientToVelocity ? ` rotate(${angle}rad)` : ''}`,
|
|
64
|
+
backgroundImage: `url(${this.#textureSrc})`,
|
|
65
|
+
backgroundSize: 'contain',
|
|
66
|
+
backgroundRepeat: 'no-repeat',
|
|
67
|
+
opacity: `${this.#startAlpha ?? 1}`,
|
|
68
|
+
mixBlendMode: this.#blendMode ?? 'normal',
|
|
69
|
+
});
|
|
70
|
+
this.#particles.push({
|
|
71
|
+
el,
|
|
72
|
+
age: 0,
|
|
73
|
+
lifespan,
|
|
74
|
+
velocityX: velocity * cos,
|
|
75
|
+
velocityY: velocity * sin,
|
|
76
|
+
fadeRate: this.#fadeRate,
|
|
77
|
+
});
|
|
78
|
+
this.el.appendChild(el);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
update(dt) {
|
|
82
|
+
super.update(dt);
|
|
83
|
+
const ps = this.#particles;
|
|
84
|
+
for (let i = 0; i < ps.length; i++) {
|
|
85
|
+
const p = ps[i];
|
|
86
|
+
const e = p.el;
|
|
87
|
+
p.age += dt;
|
|
88
|
+
if (p.age > p.lifespan) {
|
|
89
|
+
e.remove();
|
|
90
|
+
ps.splice(i, 1);
|
|
91
|
+
i--;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const x = parseFloat(e.style.left) + p.velocityX * dt;
|
|
95
|
+
const y = parseFloat(e.style.top) + p.velocityY * dt;
|
|
96
|
+
const opacity = parseFloat(e.style.opacity) + p.fadeRate * dt;
|
|
97
|
+
setStyle(e, { left: `${x}px`, top: `${y}px`, opacity: `${opacity}` });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
remove() {
|
|
101
|
+
domTextureLoader.release(this.#textureSrc);
|
|
102
|
+
super.remove();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=dom-particle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-particle.js","sourceRoot":"","sources":["../../src/dom/dom-particle.ts"],"names":[],"mappings":"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","sourcesContent":["import { BLEND_MODES } from 'pixi.js'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\ntype RandomRange = { min: number, max: number }\n\nexport type DomParticleSystemOptions = {\n texture: string\n\n count: RandomRange\n lifespan: RandomRange\n angle: RandomRange\n velocity: RandomRange\n particleScale: RandomRange\n\n startAlpha?: number\n fadeRate: number\n orientToVelocity: boolean\n\n blendMode?: BLEND_MODES // ex) 'screen', 'multiply'\n} & DomGameObjectOptions\n\ninterface Particle {\n el: HTMLDivElement\n\n age: number\n lifespan: number\n\n velocityX: number\n velocityY: number\n\n fadeRate: number\n}\n\nfunction random(min: number, max: number) {\n return Math.random() * (max - min) + min\n}\n\nexport class DomParticleSystem extends DomGameObject {\n #textureSrc: string\n #count: RandomRange\n #lifespan: RandomRange\n #angle: RandomRange\n #velocity: RandomRange\n #scale: RandomRange\n #startAlpha?: number\n #fadeRate: number\n #orientToVelocity: boolean\n #blendMode?: BLEND_MODES\n\n #texture?: HTMLImageElement\n #loadTexturePromise: Promise<void>\n #particles: Particle[] = []\n\n constructor(options: DomParticleSystemOptions) {\n super(options)\n this.el.style.pointerEvents = 'none'\n\n this.#textureSrc = options.texture\n this.#count = options.count\n this.#lifespan = options.lifespan\n this.#angle = options.angle\n this.#velocity = options.velocity\n this.#scale = options.particleScale\n this.#startAlpha = options.startAlpha\n this.#fadeRate = options.fadeRate\n this.#orientToVelocity = options.orientToVelocity\n this.#blendMode = options.blendMode\n\n this.#loadTexturePromise = this.#loadTexture()\n }\n\n async #loadTexture() {\n if (domTextureLoader.checkCached(this.#textureSrc)) {\n this.#texture = domTextureLoader.getCached(this.#textureSrc)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#textureSrc}`)\n this.#texture = await domTextureLoader.load(this.#textureSrc)\n }\n }\n\n async burst({ x, y }: { x: number; y: number }) {\n if (!this.#texture) await this.#loadTexturePromise\n\n const count = random(this.#count.min, this.#count.max)\n for (let i = 0; i < count; i++) {\n const lifespan = random(this.#lifespan.min, this.#lifespan.max)\n const angle = random(this.#angle.min, this.#angle.max)\n const sin = Math.sin(angle)\n const cos = Math.cos(angle)\n const velocity = random(this.#velocity.min, this.#velocity.max)\n const scale = random(this.#scale.min, this.#scale.max)\n\n const el = document.createElement('div')\n setStyle(el, {\n position: 'absolute',\n left: `${x}px`,\n top: `${y}px`,\n width: `${this.#texture!.width}px`,\n height: `${this.#texture!.height}px`,\n transform: `translate(-50%, -50%) scale(${scale})${this.#orientToVelocity ? ` rotate(${angle}rad)` : ''}`,\n backgroundImage: `url(${this.#textureSrc})`,\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n opacity: `${this.#startAlpha ?? 1}`,\n mixBlendMode: this.#blendMode ?? 'normal',\n })\n\n this.#particles.push({\n el,\n age: 0,\n lifespan,\n velocityX: velocity * cos,\n velocityY: velocity * sin,\n fadeRate: this.#fadeRate,\n })\n\n this.el.appendChild(el)\n }\n }\n\n protected update(dt: number) {\n super.update(dt)\n\n const ps = this.#particles\n for (let i = 0; i < ps.length; i++) {\n const p = ps[i]\n const e = p.el\n\n p.age += dt\n if (p.age > p.lifespan) {\n e.remove()\n ps.splice(i, 1)\n i--\n continue\n }\n\n const x = parseFloat(e.style.left) + p.velocityX * dt\n const y = parseFloat(e.style.top) + p.velocityY * dt\n const opacity = parseFloat(e.style.opacity) + p.fadeRate * dt\n\n setStyle(e, { left: `${x}px`, top: `${y}px`, opacity: `${opacity}` })\n }\n }\n\n override remove() {\n domTextureLoader.release(this.#textureSrc)\n super.remove()\n }\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { audioLoader } from '../asset/loaders/audio';
|
|
2
|
+
import { fontFamilyLoader } from '../asset/loaders/font';
|
|
3
|
+
import { domTextureLoader } from './dom-texture-loader';
|
|
4
|
+
const loaderForPathMap = [
|
|
5
|
+
{ check: (p) => /\.(png|jpe?g|gif|webp)$/.test(p), loader: domTextureLoader },
|
|
6
|
+
{ check: (p) => /\.(mp3|wav|ogg)$/.test(p), loader: audioLoader },
|
|
7
|
+
{ check: (p) => !p.includes('.'), loader: fontFamilyLoader }
|
|
8
|
+
];
|
|
9
|
+
function getLoaderForPath(path) {
|
|
10
|
+
return loaderForPathMap.find(({ check }) => check(path))?.loader;
|
|
11
|
+
}
|
|
12
|
+
async function loadAsset(asset) {
|
|
13
|
+
const loader = getLoaderForPath(asset);
|
|
14
|
+
if (!loader) {
|
|
15
|
+
console.warn(`No loader found for asset: ${asset}`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await loader.load(asset);
|
|
19
|
+
}
|
|
20
|
+
function releaseAsset(asset) {
|
|
21
|
+
const loader = getLoaderForPath(asset);
|
|
22
|
+
if (!loader) {
|
|
23
|
+
console.warn(`No loader found for asset: ${asset}`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
loader.release(asset);
|
|
27
|
+
}
|
|
28
|
+
export async function domPreload(assets, progressCallback) {
|
|
29
|
+
let loaded = 0;
|
|
30
|
+
const total = assets.length;
|
|
31
|
+
await Promise.all(assets.map(async (asset) => {
|
|
32
|
+
try {
|
|
33
|
+
await loadAsset(asset);
|
|
34
|
+
loaded++;
|
|
35
|
+
progressCallback?.(loaded / total);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(`Failed to load asset:`, asset, err);
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
return () => assets.forEach(releaseAsset);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dom-preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-preload.js","sourceRoot":"","sources":["../../src/dom/dom-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,gBAAgB,GAAqE;IACzF,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAC7E,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;IACjE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE;CAC7D,CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAA;AAClE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAa;IACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAA;QACnD,OAAM;IACR,CAAC;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAA;QACnD,OAAM;IACR,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAgB,EAChB,gBAA6C;IAE7C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA;IAE3B,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CAAC,CAAA;YACtB,MAAM,EAAE,CAAA;YACR,gBAAgB,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;AAC3C,CAAC","sourcesContent":["import { audioLoader } from '../asset/loaders/audio'\nimport { fontFamilyLoader } from '../asset/loaders/font'\nimport { Loader } from '../asset/loaders/loader'\nimport { domTextureLoader } from './dom-texture-loader'\n\nconst loaderForPathMap: Array<{ check: (path: string) => boolean, loader: Loader<any> }> = [\n { check: (p) => /\\.(png|jpe?g|gif|webp)$/.test(p), loader: domTextureLoader },\n { check: (p) => /\\.(mp3|wav|ogg)$/.test(p), loader: audioLoader },\n { check: (p) => !p.includes('.'), loader: fontFamilyLoader }\n]\n\nfunction getLoaderForPath(path: string): Loader<any> | undefined {\n return loaderForPathMap.find(({ check }) => check(path))?.loader\n}\n\nasync function loadAsset(asset: string): Promise<void> {\n const loader = getLoaderForPath(asset)\n if (!loader) {\n console.warn(`No loader found for asset: ${asset}`)\n return\n }\n await loader.load(asset)\n}\n\nfunction releaseAsset(asset: string): void {\n const loader = getLoaderForPath(asset)\n if (!loader) {\n console.warn(`No loader found for asset: ${asset}`)\n return\n }\n loader.release(asset)\n}\n\nexport async function domPreload(\n assets: string[],\n progressCallback?: (progress: number) => void\n): Promise<() => void> {\n let loaded = 0\n const total = assets.length\n\n await Promise.all(\n assets.map(async (asset) => {\n try {\n await loadAsset(asset)\n loaded++\n progressCallback?.(loaded / total)\n } catch (err) {\n console.error(`Failed to load asset:`, asset, err)\n }\n })\n )\n\n return () => assets.forEach(releaseAsset)\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DomGameObject } from './dom-game-object';
|
|
2
|
+
import { domTextureLoader } from './dom-texture-loader';
|
|
3
|
+
import { setStyle } from './dom-utils';
|
|
4
|
+
export class DomSpriteNode extends DomGameObject {
|
|
5
|
+
#src;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
super(options);
|
|
8
|
+
this.#src = options.src;
|
|
9
|
+
this.#load();
|
|
10
|
+
}
|
|
11
|
+
async #load() {
|
|
12
|
+
let texture;
|
|
13
|
+
if (domTextureLoader.checkCached(this.#src)) {
|
|
14
|
+
texture = domTextureLoader.getCached(this.#src);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.info(`Dom texture not preloaded. Loading now: ${this.#src}`);
|
|
18
|
+
texture = await domTextureLoader.load(this.#src);
|
|
19
|
+
}
|
|
20
|
+
setStyle(this.el, !texture ? { backgroundImage: 'none' } : {
|
|
21
|
+
backgroundImage: `url(${this.#src})`,
|
|
22
|
+
width: `${texture.width}px`,
|
|
23
|
+
height: `${texture.height}px`,
|
|
24
|
+
backgroundSize: `${texture.width}px ${texture.height}px`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
set src(src) {
|
|
28
|
+
if (this.#src !== src) {
|
|
29
|
+
domTextureLoader.release(this.#src);
|
|
30
|
+
this.#src = src;
|
|
31
|
+
this.#load();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
get src() { return this.#src; }
|
|
35
|
+
remove() {
|
|
36
|
+
domTextureLoader.release(this.#src);
|
|
37
|
+
super.remove();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=dom-sprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAMtC,MAAM,OAAO,aAA6C,SAAQ,aAAgB;IAChF,IAAI,CAAQ;IAEZ,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzD,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;YACpC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI;YAC7B,cAAc,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI;SACzD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomSpriteNodeOptions = {\n src: string\n} & DomGameObjectOptions\n\nexport class DomSpriteNode<E extends EventMap = EventMap> extends DomGameObject<E> {\n #src: string\n\n constructor(options: DomSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n setStyle(this.el, !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${texture.width}px`,\n height: `${texture.height}px`,\n backgroundSize: `${texture.width}px ${texture.height}px`,\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Loader } from '../asset/loaders/loader';
|
|
2
|
+
class DomTextureLoader extends Loader {
|
|
3
|
+
async doLoad(src) {
|
|
4
|
+
const loadingPromise = new Promise((resolve) => {
|
|
5
|
+
const image = new Image();
|
|
6
|
+
image.crossOrigin = 'anonymous';
|
|
7
|
+
image.src = src;
|
|
8
|
+
image.onload = () => {
|
|
9
|
+
this.loadingPromises.delete(src);
|
|
10
|
+
if (!this.hasActiveRef(src)) {
|
|
11
|
+
resolve(undefined);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (this.cachedAssets.has(src)) {
|
|
15
|
+
console.error(`Dom texture already loaded: ${src}`);
|
|
16
|
+
resolve(undefined);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.cachedAssets.set(src, image);
|
|
20
|
+
resolve(image);
|
|
21
|
+
};
|
|
22
|
+
image.onerror = (error) => {
|
|
23
|
+
this.loadingPromises.delete(src);
|
|
24
|
+
console.error(`Failed to load dom texture: ${src}`, error);
|
|
25
|
+
resolve(undefined);
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
this.loadingPromises.set(src, loadingPromise);
|
|
29
|
+
return await loadingPromise;
|
|
30
|
+
}
|
|
31
|
+
cleanup(src, texture) {
|
|
32
|
+
texture.remove();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export const domTextureLoader = new DomTextureLoader();
|
|
36
|
+
//# sourceMappingURL=dom-texture-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-texture-loader.js","sourceRoot":"","sources":["../../src/dom/dom-texture-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,gBAAiB,SAAQ,MAAwB;IAClC,KAAK,CAAC,MAAM,CAAC,GAAW;QACzC,MAAM,cAAc,GAAG,IAAI,OAAO,CAA+B,CAAC,OAAO,EAAE,EAAE;YAC3E,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;YACzB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAA;YAC/B,KAAK,CAAC,GAAG,GAAG,GAAG,CAAA;YAEf,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAEhC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,SAAS,CAAC,CAAA;oBAClB,OAAM;gBACR,CAAC;gBAED,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAA;oBACnD,OAAO,CAAC,SAAS,CAAC,CAAA;oBAClB,OAAM;gBACR,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBACjC,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC,CAAA;YAED,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBACxB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;gBAC1D,OAAO,CAAC,SAAS,CAAC,CAAA;YACpB,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAC7C,OAAO,MAAM,cAAc,CAAA;IAC7B,CAAC;IAEkB,OAAO,CAAC,GAAW,EAAE,OAAyB;QAC/D,OAAO,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA","sourcesContent":["import { Loader } from '../asset/loaders/loader'\n\nclass DomTextureLoader extends Loader<HTMLImageElement> {\n protected override async doLoad(src: string) {\n const loadingPromise = new Promise<HTMLImageElement | undefined>((resolve) => {\n const image = new Image()\n image.crossOrigin = 'anonymous'\n image.src = src\n\n image.onload = () => {\n this.loadingPromises.delete(src)\n\n if (!this.hasActiveRef(src)) {\n resolve(undefined)\n return\n }\n\n if (this.cachedAssets.has(src)) {\n console.error(`Dom texture already loaded: ${src}`)\n resolve(undefined)\n return\n }\n\n this.cachedAssets.set(src, image)\n resolve(image)\n }\n\n image.onerror = (error) => {\n this.loadingPromises.delete(src)\n console.error(`Failed to load dom texture: ${src}`, error)\n resolve(undefined)\n }\n })\n\n this.loadingPromises.set(src, loadingPromise)\n return await loadingPromise\n }\n\n protected override cleanup(src: string, texture: HTMLImageElement) {\n texture.remove()\n }\n}\n\nexport const domTextureLoader = new DomTextureLoader()\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function textStroke(target, width, color) {
|
|
2
|
+
let shadow = '';
|
|
3
|
+
for (let i = -width; i <= width; i++) {
|
|
4
|
+
for (let j = -width; j <= width; j++) {
|
|
5
|
+
if (i !== 0 || j !== 0) {
|
|
6
|
+
shadow += `${i}px ${j}px 0 ${color},`;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
shadow = shadow.slice(0, -1); // Remove last comma
|
|
11
|
+
target.style.textShadow = shadow;
|
|
12
|
+
return target;
|
|
13
|
+
}
|
|
14
|
+
export function setStyle(el, styles) {
|
|
15
|
+
if (!el)
|
|
16
|
+
return;
|
|
17
|
+
Object.assign(el.style, styles);
|
|
18
|
+
return el;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=dom-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-utils.js","sourceRoot":"","sources":["../../src/dom/dom-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAwB,MAAS,EAAE,KAAa,EAAE,KAAa;IACvF,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,oBAAoB;IACjD,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;IAChC,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAA2B,EAAE,MAAoC;IACxF,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,EAAE,CAAA;AACX,CAAC","sourcesContent":["export function textStroke<T extends HTMLElement>(target: T, width: number, color: string) {\n let shadow = ''\n for (let i = -width; i <= width; i++) {\n for (let j = -width; j <= width; j++) {\n if (i !== 0 || j !== 0) {\n shadow += `${i}px ${j}px 0 ${color},`\n }\n }\n }\n shadow = shadow.slice(0, -1) // Remove last comma\n target.style.textShadow = shadow\n return target\n}\n\nexport function setStyle(el: HTMLElement | undefined, styles: Partial<CSSStyleDeclaration>) {\n if (!el) return\n Object.assign(el.style, styles)\n return el\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { preload } from './asset/preload';
|
|
2
|
+
export { checkCollision } from './collision/check-collision';
|
|
3
|
+
export { ColliderType } from './collision/colliders';
|
|
4
|
+
export { enableDebug } from './debug';
|
|
5
|
+
export { GameObject } from './node/core/game-object';
|
|
6
|
+
export { AnimatedSpriteNode } from './node/ext/animated-sprite';
|
|
7
|
+
export { CircleNode } from './node/ext/circle';
|
|
8
|
+
export { DelayNode } from './node/ext/deplay';
|
|
9
|
+
export { DomContainerNode } from './node/ext/dom-container';
|
|
10
|
+
export { IntervalNode } from './node/ext/interval';
|
|
11
|
+
export { RectangleNode } from './node/ext/rectangle';
|
|
12
|
+
export { SpriteNode } from './node/ext/sprite';
|
|
13
|
+
export { PhysicsObject } from './node/physics/physics-object';
|
|
14
|
+
export { PhysicsWorld } from './node/physics/physics-world';
|
|
15
|
+
export { Renderer, RendererOptions } from './renderer/renderer';
|
|
16
|
+
//# sourceMappingURL=index%20copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index copy.js","sourceRoot":"","sources":["../src/index copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAA4B,YAAY,EAAuD,MAAM,uBAAuB,CAAA;AACnI,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,UAAU,EAAqB,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,4BAA4B,CAAA;AAC1F,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAA2B,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,aAAa,EAAwB,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA","sourcesContent":["export { AssetSource, preload } from './asset/preload'\nexport { checkCollision } from './collision/check-collision'\nexport { CircleCollider, Collider, ColliderType, EllipseCollider, PolygonCollider, RectangleCollider } from './collision/colliders'\nexport { enableDebug } from './debug'\nexport { GameObject, GameObjectOptions } from './node/core/game-object'\nexport { AnimatedSpriteNode, AnimatedSpriteNodeOptions } from './node/ext/animated-sprite'\nexport { CircleNode, CircleNodeOptions } from './node/ext/circle'\nexport { DelayNode } from './node/ext/deplay'\nexport { DomContainerNode, DomContainerNodeOptions } from './node/ext/dom-container'\nexport { IntervalNode } from './node/ext/interval'\nexport { RectangleNode, RectangleNodeOptions } from './node/ext/rectangle'\nexport { SpriteNode, SpriteNodeOptions } from './node/ext/sprite'\nexport { PhysicsObject, PhysicsObjectOptions } from './node/physics/physics-object'\nexport { PhysicsWorld } from './node/physics/physics-world'\nexport { Renderer, RendererOptions } from './renderer/renderer'\n\n"]}
|
package/lib/index.js
CHANGED
|
@@ -1,13 +1,38 @@
|
|
|
1
|
+
// Core
|
|
2
|
+
export { GameObject } from './node/core/game-object';
|
|
3
|
+
// Renderer
|
|
4
|
+
export { Renderer } from './renderer/renderer';
|
|
5
|
+
export { Ticker } from './renderer/ticker';
|
|
6
|
+
// Assets
|
|
1
7
|
export { musicPlayer, sfxPlayer } from './asset/audio';
|
|
2
8
|
export { preload } from './asset/preload';
|
|
3
|
-
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
9
|
+
// Collision
|
|
10
|
+
export { checkCollision } from './collision/check-collision';
|
|
11
|
+
export { ColliderType } from './collision/colliders';
|
|
12
|
+
// Node Extensions
|
|
13
|
+
export { AnimatedSpriteNode } from './node/ext/animated-sprite';
|
|
14
|
+
export { BitmapTextNode } from './node/ext/bitmap-text';
|
|
15
|
+
export { CircleNode } from './node/ext/circle';
|
|
16
|
+
export { DelayNode } from './node/ext/deplay';
|
|
17
|
+
export { DomContainerNode } from './node/ext/dom-container';
|
|
18
|
+
export { IntervalNode } from './node/ext/interval';
|
|
19
|
+
export { ParticleSystem } from './node/ext/particle';
|
|
20
|
+
export { RectangleNode } from './node/ext/rectangle';
|
|
21
|
+
export { SpineNode } from './node/ext/spine';
|
|
22
|
+
export { SpriteNode } from './node/ext/sprite';
|
|
23
|
+
// Physics
|
|
24
|
+
export { PhysicsObject } from './node/physics/physics-object';
|
|
25
|
+
export { PhysicsWorld } from './node/physics/physics-world';
|
|
26
|
+
// DOM Nodes
|
|
27
|
+
export { DomAnimatedSpriteNode } from './dom/dom-animated-sprite';
|
|
28
|
+
export { DomParticleSystem } from './dom/dom-particle';
|
|
29
|
+
export { domPreload } from './dom/dom-preload';
|
|
30
|
+
export { DomSpriteNode } from './dom/dom-sprite';
|
|
31
|
+
export { setStyle, textStroke } from './dom/dom-utils';
|
|
32
|
+
// Input
|
|
33
|
+
export { Joystick } from './input/joystick';
|
|
34
|
+
// Utils
|
|
35
|
+
export { isMobile } from './utils/device';
|
|
36
|
+
// Debug
|
|
37
|
+
export { debugMode, enableDebug } from './debug';
|
|
13
38
|
//# sourceMappingURL=index.js.map
|