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
package/src/asset/audio.ts
CHANGED
|
@@ -1,176 +1,220 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isMobile } from '../utils/device'
|
|
2
|
+
import { audioLoader } from './loaders/audio'
|
|
2
3
|
|
|
3
|
-
const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()
|
|
4
|
-
window.addEventListener('mousedown', () => audioContext.resume())
|
|
5
|
-
window.addEventListener('touchend', () => audioContext.resume())
|
|
4
|
+
export const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()
|
|
5
|
+
window.addEventListener('mousedown', () => audioContext.resume())
|
|
6
|
+
window.addEventListener('touchend', () => audioContext.resume())
|
|
6
7
|
|
|
7
8
|
async function getAvailableContext(): Promise<AudioContext> {
|
|
8
|
-
if (audioContext.state === 'suspended') await audioContext.resume()
|
|
9
|
-
return audioContext
|
|
9
|
+
if (audioContext.state === 'suspended') await audioContext.resume()
|
|
10
|
+
return audioContext
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
let isPageVisible = !document.hidden
|
|
14
|
+
window.addEventListener('visibilitychange', () => isPageVisible = !document.hidden)
|
|
15
|
+
|
|
16
|
+
type BasicStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>
|
|
17
|
+
|
|
18
|
+
type SafeStorage = BasicStorage & {
|
|
19
|
+
persistent: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createSafeStorage(): SafeStorage {
|
|
23
|
+
const memory = (() => {
|
|
24
|
+
const m = new Map<string, string>()
|
|
25
|
+
const api: SafeStorage = {
|
|
26
|
+
persistent: false,
|
|
27
|
+
getItem: (k) => (m.has(k) ? m.get(k)! : null),
|
|
28
|
+
setItem: (k, v) => { m.set(k, String(v)) },
|
|
29
|
+
removeItem: (k) => { m.delete(k) },
|
|
30
|
+
}
|
|
31
|
+
return api
|
|
32
|
+
})()
|
|
33
|
+
|
|
34
|
+
if (typeof window === 'undefined') return memory
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const ls = window.localStorage
|
|
38
|
+
const probeKey = '__safe_ls_probe__' + Math.random().toString(36).slice(2)
|
|
39
|
+
ls.setItem(probeKey, '1')
|
|
40
|
+
ls.removeItem(probeKey)
|
|
41
|
+
|
|
42
|
+
const safe: SafeStorage = {
|
|
43
|
+
persistent: true,
|
|
44
|
+
getItem: (k) => ls.getItem(k),
|
|
45
|
+
setItem: (k, v) => ls.setItem(k, v),
|
|
46
|
+
removeItem: (k) => ls.removeItem(k),
|
|
47
|
+
}
|
|
48
|
+
return safe
|
|
49
|
+
} catch {
|
|
50
|
+
return memory
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const safeStorage = createSafeStorage()
|
|
15
55
|
|
|
16
56
|
class Audio {
|
|
17
|
-
src: string
|
|
18
|
-
#volume: number
|
|
19
|
-
#loop: boolean
|
|
57
|
+
src: string
|
|
58
|
+
#volume: number
|
|
59
|
+
#loop: boolean
|
|
20
60
|
|
|
21
|
-
#audioBuffer?: AudioBuffer
|
|
22
|
-
#audioContext?: AudioContext
|
|
23
|
-
#gainNode?: GainNode
|
|
24
|
-
#source?: AudioBufferSourceNode
|
|
61
|
+
#audioBuffer?: AudioBuffer
|
|
62
|
+
#audioContext?: AudioContext
|
|
63
|
+
#gainNode?: GainNode
|
|
64
|
+
#source?: AudioBufferSourceNode
|
|
25
65
|
|
|
26
|
-
#isPlaying = false
|
|
27
|
-
#isPaused = false
|
|
28
|
-
#startTime = 0
|
|
29
|
-
#pauseTime = 0
|
|
30
|
-
#offset = 0
|
|
66
|
+
#isPlaying = false
|
|
67
|
+
#isPaused = false
|
|
68
|
+
#startTime = 0
|
|
69
|
+
#pauseTime = 0
|
|
70
|
+
#offset = 0
|
|
31
71
|
|
|
32
72
|
constructor(src: string, volume: number, loop: boolean) {
|
|
33
|
-
this.src = src
|
|
34
|
-
this.#volume = volume
|
|
35
|
-
this.#loop = loop
|
|
36
|
-
this.play()
|
|
73
|
+
this.src = src
|
|
74
|
+
this.#volume = volume
|
|
75
|
+
this.#loop = loop
|
|
76
|
+
this.play()
|
|
37
77
|
}
|
|
38
78
|
|
|
39
|
-
get volume() { return this.#volume
|
|
79
|
+
get volume() { return this.#volume }
|
|
40
80
|
set volume(volume: number) {
|
|
41
|
-
this.#volume = volume
|
|
42
|
-
if (this.#gainNode) this.#gainNode.gain.value = Math.max(0, Math.min(1, volume))
|
|
81
|
+
this.#volume = volume
|
|
82
|
+
if (this.#gainNode) this.#gainNode.gain.value = Math.max(0, Math.min(1, volume))
|
|
43
83
|
}
|
|
44
84
|
|
|
45
85
|
async play() {
|
|
46
|
-
if (isMobile && !isPageVisible) return
|
|
86
|
+
if (isMobile && !isPageVisible) return
|
|
47
87
|
|
|
48
88
|
if (!this.#audioBuffer) {
|
|
49
|
-
if (
|
|
50
|
-
|
|
89
|
+
if (audioLoader.checkCached(this.src)) {
|
|
90
|
+
this.#audioBuffer = audioLoader.getCached(this.src)
|
|
91
|
+
} else {
|
|
92
|
+
console.info(`Audio not preloaded. Loading now: ${this.src}`)
|
|
93
|
+
this.#audioBuffer = await audioLoader.load(this.src)
|
|
51
94
|
}
|
|
52
|
-
this.#audioBuffer = await audioLoader.load(this.src);
|
|
53
95
|
}
|
|
54
|
-
if (!this.#audioBuffer) return
|
|
96
|
+
if (!this.#audioBuffer) return
|
|
55
97
|
|
|
56
|
-
if (this.#isPlaying) this.stop()
|
|
57
|
-
if (!this.#isPaused) this.#offset = 0
|
|
58
|
-
this.#isPlaying = true
|
|
59
|
-
this.#isPaused = false
|
|
60
|
-
if (!this.#audioContext) this.#audioContext = await getAvailableContext()
|
|
61
|
-
if (!this.#isPlaying) return
|
|
98
|
+
if (this.#isPlaying) this.stop()
|
|
99
|
+
if (!this.#isPaused) this.#offset = 0
|
|
100
|
+
this.#isPlaying = true
|
|
101
|
+
this.#isPaused = false
|
|
102
|
+
if (!this.#audioContext) this.#audioContext = await getAvailableContext()
|
|
103
|
+
if (!this.#isPlaying) return
|
|
62
104
|
|
|
63
105
|
if (!this.#gainNode) {
|
|
64
|
-
this.#gainNode = this.#audioContext.createGain()
|
|
65
|
-
this.#gainNode.gain.value = this.#volume
|
|
66
|
-
this.#gainNode.connect(this.#audioContext.destination)
|
|
106
|
+
this.#gainNode = this.#audioContext.createGain()
|
|
107
|
+
this.#gainNode.gain.value = this.#volume
|
|
108
|
+
this.#gainNode.connect(this.#audioContext.destination)
|
|
67
109
|
}
|
|
68
110
|
|
|
69
|
-
this.#source = this.#audioContext.createBufferSource()
|
|
70
|
-
this.#source.buffer = this.#audioBuffer
|
|
71
|
-
this.#source.loop = this.#loop
|
|
72
|
-
this.#source.connect(this.#gainNode)
|
|
73
|
-
this.#source.start(0, this.#offset)
|
|
74
|
-
this.#startTime = this.#audioContext.currentTime
|
|
75
|
-
this.#source.onended = () => { if (!this.#isPaused && !this.#loop) this.stop()
|
|
111
|
+
this.#source = this.#audioContext.createBufferSource()
|
|
112
|
+
this.#source.buffer = this.#audioBuffer
|
|
113
|
+
this.#source.loop = this.#loop
|
|
114
|
+
this.#source.connect(this.#gainNode)
|
|
115
|
+
this.#source.start(0, this.#offset)
|
|
116
|
+
this.#startTime = this.#audioContext.currentTime
|
|
117
|
+
this.#source.onended = () => { if (!this.#isPaused && !this.#loop) this.stop() }
|
|
76
118
|
}
|
|
77
119
|
|
|
78
120
|
#clear(): void {
|
|
79
121
|
if (this.#source) {
|
|
80
|
-
this.#source.stop()
|
|
81
|
-
this.#source.disconnect()
|
|
82
|
-
this.#source = undefined
|
|
122
|
+
this.#source.stop()
|
|
123
|
+
this.#source.disconnect()
|
|
124
|
+
this.#source = undefined
|
|
83
125
|
}
|
|
84
126
|
}
|
|
85
127
|
|
|
86
128
|
pause() {
|
|
87
129
|
if (this.#isPlaying && !this.#isPaused) {
|
|
88
130
|
if (this.#audioContext) {
|
|
89
|
-
this.#pauseTime = this.#audioContext.currentTime
|
|
90
|
-
this.#offset += this.#pauseTime - this.#startTime
|
|
131
|
+
this.#pauseTime = this.#audioContext.currentTime
|
|
132
|
+
this.#offset += this.#pauseTime - this.#startTime
|
|
91
133
|
}
|
|
92
|
-
this.#isPaused = true
|
|
93
|
-
this.#isPlaying = false
|
|
94
|
-
this.#clear()
|
|
134
|
+
this.#isPaused = true
|
|
135
|
+
this.#isPlaying = false
|
|
136
|
+
this.#clear()
|
|
95
137
|
}
|
|
96
138
|
}
|
|
97
139
|
|
|
98
140
|
stop() {
|
|
99
|
-
this.#isPlaying = false
|
|
100
|
-
this.#isPaused = false
|
|
101
|
-
this.#offset = 0
|
|
102
|
-
this.#clear()
|
|
141
|
+
this.#isPlaying = false
|
|
142
|
+
this.#isPaused = false
|
|
143
|
+
this.#offset = 0
|
|
144
|
+
this.#clear()
|
|
103
145
|
}
|
|
104
146
|
}
|
|
105
147
|
|
|
106
148
|
class MusicPlayer {
|
|
107
|
-
#volume = 0.7
|
|
108
|
-
#currentAudio?: Audio
|
|
149
|
+
#volume = 0.7
|
|
150
|
+
#currentAudio?: Audio
|
|
109
151
|
|
|
110
152
|
constructor() {
|
|
111
|
-
const stored = parseFloat(
|
|
112
|
-
this.#volume = Number.isNaN(stored) ? this.#volume : stored
|
|
153
|
+
const stored = parseFloat(safeStorage.getItem('musicVolume') || '')
|
|
154
|
+
this.#volume = Number.isNaN(stored) ? this.#volume : stored
|
|
113
155
|
|
|
114
156
|
if (isMobile) {
|
|
115
157
|
document.addEventListener('visibilitychange', () => {
|
|
116
|
-
if (document.hidden) this.pause()
|
|
158
|
+
if (document.hidden) this.pause()
|
|
117
159
|
else {
|
|
118
|
-
isPageVisible = true
|
|
119
|
-
this.#currentAudio?.play()
|
|
160
|
+
isPageVisible = true
|
|
161
|
+
this.#currentAudio?.play()
|
|
120
162
|
}
|
|
121
|
-
})
|
|
163
|
+
})
|
|
122
164
|
}
|
|
123
165
|
}
|
|
124
166
|
|
|
125
167
|
get volume() {
|
|
126
|
-
return this.#volume
|
|
168
|
+
return this.#volume
|
|
127
169
|
}
|
|
128
170
|
|
|
129
171
|
set volume(volume: number) {
|
|
130
|
-
this.#volume = volume
|
|
131
|
-
|
|
132
|
-
if (this.#currentAudio) this.#currentAudio.volume = volume
|
|
172
|
+
this.#volume = volume
|
|
173
|
+
safeStorage.setItem('musicVolume', volume.toString())
|
|
174
|
+
if (this.#currentAudio) this.#currentAudio.volume = volume
|
|
133
175
|
}
|
|
134
176
|
|
|
135
177
|
play(src: string) {
|
|
136
|
-
if (this.#currentAudio?.src === src) return
|
|
137
|
-
this.#currentAudio?.stop()
|
|
138
|
-
this.#currentAudio = new Audio(src, this.#volume, true)
|
|
178
|
+
if (this.#currentAudio?.src === src) return
|
|
179
|
+
this.#currentAudio?.stop()
|
|
180
|
+
this.#currentAudio = new Audio(src, this.#volume, true)
|
|
139
181
|
}
|
|
140
182
|
|
|
141
183
|
pause() {
|
|
142
|
-
this.#currentAudio?.pause()
|
|
184
|
+
this.#currentAudio?.pause()
|
|
143
185
|
}
|
|
144
186
|
|
|
145
187
|
stop() {
|
|
146
|
-
this.#currentAudio?.stop()
|
|
147
|
-
this.#currentAudio = undefined
|
|
188
|
+
this.#currentAudio?.stop()
|
|
189
|
+
this.#currentAudio = undefined
|
|
148
190
|
}
|
|
149
191
|
}
|
|
150
192
|
|
|
151
193
|
class SfxPlayer {
|
|
152
|
-
#volume = 1
|
|
194
|
+
#volume = 1
|
|
153
195
|
|
|
154
196
|
constructor() {
|
|
155
|
-
const stored = parseFloat(
|
|
156
|
-
this.#volume = Number.isNaN(stored) ? this.#volume : stored
|
|
197
|
+
const stored = parseFloat(safeStorage.getItem('sfxVolume') || '')
|
|
198
|
+
this.#volume = Number.isNaN(stored) ? this.#volume : stored
|
|
157
199
|
}
|
|
158
200
|
|
|
159
201
|
get volume() {
|
|
160
|
-
return this.#volume
|
|
202
|
+
return this.#volume
|
|
161
203
|
}
|
|
162
204
|
|
|
163
205
|
set volume(volume: number) {
|
|
164
|
-
this.#volume = volume
|
|
165
|
-
|
|
206
|
+
this.#volume = volume
|
|
207
|
+
safeStorage.setItem('sfxVolume', volume.toString())
|
|
166
208
|
}
|
|
167
209
|
|
|
168
210
|
play(src: string) {
|
|
169
|
-
new Audio(src, this.#volume, false)
|
|
211
|
+
new Audio(src, this.#volume, false)
|
|
170
212
|
}
|
|
171
|
-
}
|
|
172
213
|
|
|
173
|
-
|
|
174
|
-
|
|
214
|
+
playRandom(...srcs: string[]) {
|
|
215
|
+
this.play(srcs[Math.floor(Math.random() * srcs.length)])
|
|
216
|
+
}
|
|
217
|
+
}
|
|
175
218
|
|
|
176
|
-
export
|
|
219
|
+
export const musicPlayer = new MusicPlayer()
|
|
220
|
+
export const sfxPlayer = new SfxPlayer()
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import { audioContext } from '../audio'
|
|
2
|
-
import { Loader } from './loader'
|
|
1
|
+
import { audioContext } from '../audio'
|
|
2
|
+
import { Loader } from './loader'
|
|
3
3
|
|
|
4
4
|
class AudioLoader extends Loader<AudioBuffer> {
|
|
5
|
-
protected override async
|
|
5
|
+
protected override async doLoad(src: string) {
|
|
6
6
|
const loadingPromise = (async () => {
|
|
7
|
-
const response = await fetch(src)
|
|
7
|
+
const response = await fetch(src)
|
|
8
8
|
if (!response.ok) {
|
|
9
|
-
console.error(`Failed to load audio data: ${src}`)
|
|
10
|
-
return
|
|
9
|
+
console.error(`Failed to load audio data: ${src}`)
|
|
10
|
+
return
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
const arrayBuffer = await response.arrayBuffer()
|
|
13
|
+
const arrayBuffer = await response.arrayBuffer()
|
|
14
14
|
|
|
15
15
|
try {
|
|
16
|
-
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer)
|
|
16
|
+
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer)
|
|
17
17
|
|
|
18
|
-
this.loadingPromises.delete(src)
|
|
18
|
+
this.loadingPromises.delete(src)
|
|
19
19
|
|
|
20
20
|
if (this.hasActiveRef(src)) {
|
|
21
|
-
if (this.
|
|
22
|
-
console.error(`Audio buffer already exists: ${src}`)
|
|
21
|
+
if (this.cachedAssets.has(src)) {
|
|
22
|
+
console.error(`Audio buffer already exists: ${src}`)
|
|
23
23
|
} else {
|
|
24
|
-
this.
|
|
25
|
-
return audioBuffer
|
|
24
|
+
this.cachedAssets.set(src, audioBuffer)
|
|
25
|
+
return audioBuffer
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
} catch (error) {
|
|
29
|
-
console.error(`Failed to decode audio data: ${src}`, error)
|
|
30
|
-
this.loadingPromises.delete(src)
|
|
29
|
+
console.error(`Failed to decode audio data: ${src}`, error)
|
|
30
|
+
this.loadingPromises.delete(src)
|
|
31
31
|
}
|
|
32
|
-
})()
|
|
32
|
+
})()
|
|
33
33
|
|
|
34
|
-
this.loadingPromises.set(src, loadingPromise)
|
|
35
|
-
return await loadingPromise
|
|
34
|
+
this.loadingPromises.set(src, loadingPromise)
|
|
35
|
+
return await loadingPromise
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
export const audioLoader = new AudioLoader()
|
|
39
|
+
export const audioLoader = new AudioLoader()
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { Loader } from './loader'
|
|
1
|
+
import { Loader } from './loader'
|
|
2
2
|
|
|
3
3
|
class BinaryLoader extends Loader<Uint8Array> {
|
|
4
|
-
protected override async
|
|
4
|
+
protected override async doLoad(src: string) {
|
|
5
5
|
const loadingPromise = (async () => {
|
|
6
|
-
const response = await fetch(src)
|
|
6
|
+
const response = await fetch(src)
|
|
7
7
|
if (!response.ok) {
|
|
8
|
-
console.error(`Failed to load binary data: ${src}`)
|
|
9
|
-
return
|
|
8
|
+
console.error(`Failed to load binary data: ${src}`)
|
|
9
|
+
return
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
const arrayBuffer = await response.arrayBuffer()
|
|
13
|
-
const data = new Uint8Array(arrayBuffer)
|
|
12
|
+
const arrayBuffer = await response.arrayBuffer()
|
|
13
|
+
const data = new Uint8Array(arrayBuffer)
|
|
14
14
|
|
|
15
|
-
this.loadingPromises.delete(src)
|
|
15
|
+
this.loadingPromises.delete(src)
|
|
16
16
|
|
|
17
17
|
if (this.hasActiveRef(src)) {
|
|
18
|
-
if (this.
|
|
19
|
-
console.error(`Binary data already exists: ${src}`)
|
|
18
|
+
if (this.cachedAssets.has(src)) {
|
|
19
|
+
console.error(`Binary data already exists: ${src}`)
|
|
20
20
|
} else {
|
|
21
|
-
this.
|
|
22
|
-
return data
|
|
21
|
+
this.cachedAssets.set(src, data)
|
|
22
|
+
return data
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
})()
|
|
25
|
+
})()
|
|
26
26
|
|
|
27
|
-
this.loadingPromises.set(src, loadingPromise)
|
|
28
|
-
return await loadingPromise
|
|
27
|
+
this.loadingPromises.set(src, loadingPromise)
|
|
28
|
+
return await loadingPromise
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export const binaryLoader = new BinaryLoader()
|
|
32
|
+
export const binaryLoader = new BinaryLoader()
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BitmapFont, Char } from '../../types/bitmap-font'
|
|
2
|
+
import { Loader } from './loader'
|
|
3
|
+
import { textureLoader } from './texture'
|
|
4
|
+
|
|
5
|
+
class BitmapFontLoader extends Loader<BitmapFont> {
|
|
6
|
+
#fntToSrc = new Map<string, string>()
|
|
7
|
+
|
|
8
|
+
protected override async doLoad(fnt: string, src: string) {
|
|
9
|
+
this.#fntToSrc.set(fnt, src)
|
|
10
|
+
|
|
11
|
+
const loadingPromise = (async () => {
|
|
12
|
+
const texture = await textureLoader.load(src)
|
|
13
|
+
if (!texture) {
|
|
14
|
+
console.error(`Failed to load texture: ${src}`)
|
|
15
|
+
return
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const response = await fetch(fnt)
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
console.error(`Failed to load font xml: ${fnt}`)
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const text = await response.text()
|
|
26
|
+
|
|
27
|
+
const parser = new DOMParser()
|
|
28
|
+
const xmlDoc = parser.parseFromString(text, 'application/xml')
|
|
29
|
+
|
|
30
|
+
const infoEl = xmlDoc.getElementsByTagName('info')[0]
|
|
31
|
+
const commonEl = xmlDoc.getElementsByTagName('common')[0]
|
|
32
|
+
const charEls = xmlDoc.getElementsByTagName('char')
|
|
33
|
+
|
|
34
|
+
const size = parseInt(infoEl.getAttribute('size') || '16', 10)
|
|
35
|
+
const lineHeight = parseInt(commonEl.getAttribute('lineHeight') || '32', 10)
|
|
36
|
+
|
|
37
|
+
const chars: Record<number, Char> = {}
|
|
38
|
+
|
|
39
|
+
for (let i = 0; i < charEls.length; i++) {
|
|
40
|
+
const charEl = charEls[i]
|
|
41
|
+
|
|
42
|
+
const id = parseInt(charEl.getAttribute('id')!, 10)
|
|
43
|
+
const x = parseInt(charEl.getAttribute('x')!, 10)
|
|
44
|
+
const y = parseInt(charEl.getAttribute('y')!, 10)
|
|
45
|
+
const width = parseInt(charEl.getAttribute('width')!, 10)
|
|
46
|
+
const height = parseInt(charEl.getAttribute('height')!, 10)
|
|
47
|
+
const xoffset = parseInt(charEl.getAttribute('xoffset')!, 10)
|
|
48
|
+
const yoffset = parseInt(charEl.getAttribute('yoffset')!, 10)
|
|
49
|
+
const xadvance = parseInt(charEl.getAttribute('xadvance')!, 10)
|
|
50
|
+
|
|
51
|
+
chars[id] = { x, y, width, height, xoffset, yoffset, xadvance }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.loadingPromises.delete(fnt)
|
|
55
|
+
|
|
56
|
+
const bitmapFont = { src, chars, texture, size, lineHeight }
|
|
57
|
+
if (this.hasActiveRef(fnt)) {
|
|
58
|
+
if (this.cachedAssets.has(fnt)) {
|
|
59
|
+
textureLoader.release(src)
|
|
60
|
+
console.error(`Bitmap font already exists: ${fnt}`)
|
|
61
|
+
} else {
|
|
62
|
+
this.cachedAssets.set(fnt, bitmapFont)
|
|
63
|
+
return bitmapFont
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
textureLoader.release(src)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error(`Failed to decode font xml: ${fnt}`, error)
|
|
71
|
+
this.loadingPromises.delete(fnt)
|
|
72
|
+
}
|
|
73
|
+
})()
|
|
74
|
+
|
|
75
|
+
this.loadingPromises.set(fnt, loadingPromise)
|
|
76
|
+
return await loadingPromise
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected override cleanup(fnt: string) {
|
|
80
|
+
const src = this.#fntToSrc.get(fnt)
|
|
81
|
+
if (src) textureLoader.release(src)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const bitmapFontLoader = new BitmapFontLoader()
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { Loader } from './loader'
|
|
1
|
+
import { Loader } from './loader'
|
|
2
2
|
|
|
3
3
|
class FontFamilyLoader extends Loader<boolean> {
|
|
4
|
-
protected override async
|
|
4
|
+
protected override async doLoad(fontName: string) {
|
|
5
5
|
const loadingPromise = (async () => {
|
|
6
6
|
if ('fonts' in document) {
|
|
7
7
|
try {
|
|
8
|
-
await document.fonts.load(`1em ${fontName}`)
|
|
9
|
-
await document.fonts.ready
|
|
10
|
-
this.loadingPromises.delete(fontName)
|
|
11
|
-
return true
|
|
8
|
+
await document.fonts.load(`1em ${fontName}`)
|
|
9
|
+
await document.fonts.ready
|
|
10
|
+
this.loadingPromises.delete(fontName)
|
|
11
|
+
return true
|
|
12
12
|
} catch (error) {
|
|
13
|
-
console.error(`Failed to load font: ${fontName}`, error)
|
|
14
|
-
this.loadingPromises.delete(fontName)
|
|
13
|
+
console.error(`Failed to load font: ${fontName}`, error)
|
|
14
|
+
this.loadingPromises.delete(fontName)
|
|
15
15
|
}
|
|
16
16
|
} else {
|
|
17
|
-
console.warn(`This browser does not support the Font Loading API`)
|
|
18
|
-
this.loadingPromises.delete(fontName)
|
|
17
|
+
console.warn(`This browser does not support the Font Loading API`)
|
|
18
|
+
this.loadingPromises.delete(fontName)
|
|
19
19
|
}
|
|
20
|
-
})()
|
|
20
|
+
})()
|
|
21
21
|
|
|
22
|
-
this.loadingPromises.set(fontName, loadingPromise)
|
|
23
|
-
return await loadingPromise
|
|
22
|
+
this.loadingPromises.set(fontName, loadingPromise)
|
|
23
|
+
return await loadingPromise
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export const fontFamilyLoader = new FontFamilyLoader()
|
|
27
|
+
export const fontFamilyLoader = new FontFamilyLoader()
|
|
@@ -1,39 +1,43 @@
|
|
|
1
|
-
abstract class Loader<T> {
|
|
2
|
-
protected
|
|
3
|
-
protected loadingPromises
|
|
1
|
+
export abstract class Loader<T> {
|
|
2
|
+
protected cachedAssets = new Map<string, T>()
|
|
3
|
+
protected loadingPromises = new Map<string, Promise<T | undefined>>()
|
|
4
4
|
|
|
5
|
-
#refCount
|
|
6
|
-
#incRefCount(id: string) { this.#refCount.set(id, (this.#refCount.get(id) || 0) + 1)
|
|
5
|
+
#refCount = new Map<string, number>()
|
|
6
|
+
#incRefCount(id: string) { this.#refCount.set(id, (this.#refCount.get(id) || 0) + 1) }
|
|
7
7
|
|
|
8
|
-
protected hasActiveRef(id: string) { return this.#refCount.get(id)! > 0
|
|
9
|
-
protected abstract
|
|
10
|
-
protected
|
|
8
|
+
protected hasActiveRef(id: string) { return this.#refCount.get(id)! > 0 }
|
|
9
|
+
protected abstract doLoad(id: string, ...args: any[]): Promise<T | undefined>
|
|
10
|
+
protected cleanup(id: string, asset: T): void { /* override to clean up */ }
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
return this.
|
|
12
|
+
checkCached(id: string) {
|
|
13
|
+
return this.cachedAssets.has(id)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getCached(id: string) {
|
|
17
|
+
if (!this.checkCached(id)) throw new Error(`Asset not found: ${id}`)
|
|
18
|
+
this.#incRefCount(id)
|
|
19
|
+
return this.cachedAssets.get(id)
|
|
14
20
|
}
|
|
15
21
|
|
|
16
22
|
async load(id: string, ...args: any[]) {
|
|
17
|
-
this.#incRefCount(id)
|
|
18
|
-
if (this.
|
|
19
|
-
if (this.loadingPromises.has(id)) return await this.loadingPromises.get(id)
|
|
20
|
-
return await this.
|
|
23
|
+
this.#incRefCount(id)
|
|
24
|
+
if (this.checkCached(id)) return this.cachedAssets.get(id)
|
|
25
|
+
if (this.loadingPromises.has(id)) return await this.loadingPromises.get(id)
|
|
26
|
+
return await this.doLoad(id, ...args)
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
release(id: string) {
|
|
24
|
-
const refCount = this.#refCount.get(id)
|
|
25
|
-
if (refCount === undefined) throw new Error(`Asset not found: ${id}`)
|
|
30
|
+
const refCount = this.#refCount.get(id)
|
|
31
|
+
if (refCount === undefined) throw new Error(`Asset not found: ${id}`)
|
|
26
32
|
if (refCount === 1) {
|
|
27
|
-
this.#refCount.delete(id)
|
|
28
|
-
const asset = this.
|
|
33
|
+
this.#refCount.delete(id)
|
|
34
|
+
const asset = this.cachedAssets.get(id)
|
|
29
35
|
if (asset) {
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
36
|
+
this.cleanup(id, asset)
|
|
37
|
+
this.cachedAssets.delete(id)
|
|
32
38
|
}
|
|
33
39
|
} else {
|
|
34
|
-
this.#refCount.set(id, refCount - 1)
|
|
40
|
+
this.#refCount.set(id, refCount - 1)
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
}
|
|
38
|
-
|
|
39
|
-
export { Loader };
|