diff --git a/package-lock.json b/package-lock.json index 00a7e34..92d4843 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "dependencies": { "@capacitor/android": "^4.7.0", "@capacitor/core": "^4.7.0", - "@pixi/gif": "^2.0.1", - "@pixi/sound": "^5.0.0", + "@pixi/gif": "^3.0.0", + "@pixi/sound": "^6.0.0", "@tweenjs/tween.js": "^18.6.4", "dat.gui": "^0.7.9", "matter-js": "^0.18.0", - "pixi.js": "^7.0.4" + "pixi.js": "^8.0.1" }, "devDependencies": { "@capacitor/cli": "^4.7.0", @@ -230,240 +230,25 @@ "node": ">=10.3.0" } }, - "node_modules/@pixi/accessibility": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.0.4.tgz", - "integrity": "sha512-ExwRleeR1uWAOsbMg1bshh7OwYsnecIRpxdtkSYcxcCkk0ZNyjm6Z4WrQ3B170DpGMUy/5cZa6WnVok0a2OxMA==" - }, - "node_modules/@pixi/app": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.0.4.tgz", - "integrity": "sha512-HXQHcLFNKm1d1IY0i2VigwgVxLO0ODS29TPhQv4m1q/w7FbgW2dWa0oDQS0ei0Bl/tlExd296YSrGfnbfw4Ypw==" - }, - "node_modules/@pixi/assets": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.0.4.tgz", - "integrity": "sha512-SsF8oVY3FTBP5sy2KkrmYhlN3NNQSKdo+pttqWzuNA0bfl431q/6dytSYTWOHkKwhk5n+eAIZflQVuBht4X4aA==", - "dependencies": { - "@types/css-font-loading-module": "^0.0.7" - } - }, - "node_modules/@pixi/compressed-textures": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.0.4.tgz", - "integrity": "sha512-N04PAsvRqGL1WhFmr3A+qCWAlJuJOxMr04w3eLY+gD9a5fQjB8XYgeeEOuz/hJ+qWRFhGwhYUo2F0MrQg5d24Q==" - }, - "node_modules/@pixi/constants": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.0.4.tgz", - "integrity": "sha512-HS8fvDZ4jn7jeEPeYfrB0bPSLW6yfVWxQwXUX6BAQOhpEZXlPpa3uKwl+wxhVh+9OGXBvlMcbxZTPEDMdB6xJQ==" - }, - "node_modules/@pixi/core": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.0.4.tgz", - "integrity": "sha512-tM0Cz8r9EFivBoGnYQ1043of9Qp4Usr7YQ0vK29rF2HInNannrTFO2F/tXBoClRsCJUw0Y2R8C4n06tAovGiWg==", - "dependencies": { - "@pixi/constants": "7.0.4", - "@pixi/extensions": "7.0.4", - "@pixi/math": "7.0.4", - "@pixi/runner": "7.0.4", - "@pixi/settings": "7.0.4", - "@pixi/ticker": "7.0.4", - "@pixi/utils": "7.0.4", - "@types/offscreencanvas": "^2019.6.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/display": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.0.4.tgz", - "integrity": "sha512-mYz1j+bIOqDdd3tR7/B6hhCgfY1fvkGsCcespW3y8i3dHBgcO/PFggmpy3Op4yx/b2f8w4HkCm8ssvwx585kxg==" - }, - "node_modules/@pixi/events": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.0.4.tgz", - "integrity": "sha512-EQyEeo8ajsHgvDY9MqnI8V6D+/9cJDZZvjDAAMVeVs5W3aJ05LcWEXRRL9CnlwLld0qfuv2eFbeHznl0yMVXXg==" - }, - "node_modules/@pixi/extensions": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.0.4.tgz", - "integrity": "sha512-NRwQ+R1nctH98u0h4mUTwYsqC72t7MakUPgJ8b51HslMAHerfqhymntX/E4f3pFuulSWAnsbR5sEVAee9b1XDw==" - }, - "node_modules/@pixi/extract": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.0.4.tgz", - "integrity": "sha512-fchsSpkxHDQBKlQHwF0bVH69ZhI1Z+2rRoZn6ninAMU9QrliUSotrQDrq9Oh0kJAQUmBaQClnEM9IFDzIHwV2A==" - }, - "node_modules/@pixi/filter-alpha": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.0.4.tgz", - "integrity": "sha512-IgBLVZQVryGVVAEvcrmj13VYnSBS57z6eRKi4QPjrpAzv1G4dP1nJSgT8HQjn18OF/UN7dfxt21Y3fsG7o+y/Q==" - }, - "node_modules/@pixi/filter-blur": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.0.4.tgz", - "integrity": "sha512-zzgDN9ipooPNbLm3CbtqL+/rN92Gml0oOYWUDy7qulTlHDCXw8BRZ6RnWnY6KBZS3LzuSIGv0GLXYdeBGnY+6w==" - }, - "node_modules/@pixi/filter-color-matrix": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.0.4.tgz", - "integrity": "sha512-ROT4QCTRnCm1AwE5zdU0PPK1vDrtJHNF3FSRJ+qEGgRVRoG4io6uh8AaM6PAqDpAODLp4TN45eU25Sg6Q4A/rQ==" - }, - "node_modules/@pixi/filter-displacement": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.0.4.tgz", - "integrity": "sha512-tSX78DqsjdQQmpGAFBONcO40jx/Ia4FT1KxPAN2TTzhOxjNK9mbe/wlP01Sw2t3uiKj6xKLeQS80dyKMulhrUQ==" - }, - "node_modules/@pixi/filter-fxaa": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.0.4.tgz", - "integrity": "sha512-wVdhDJgAbWQs+bEcZ26dNBApuDsyHqsrSkNhn4lVl7i3Hc1xm505w7aWWT/6rL9cR6S5W3ss/k6kSahbjmVBIg==" - }, - "node_modules/@pixi/filter-noise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.0.4.tgz", - "integrity": "sha512-UBsBaLFV0v5KGvcDCsaRyrNZXHirFLVdGgwPbeDpiJLvyPu1bTfoxeImu+c8okKivwbho2oomXIU374KFa/BvA==" + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==" }, "node_modules/@pixi/gif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@pixi/gif/-/gif-2.0.1.tgz", - "integrity": "sha512-hs3WgJvQfTYnZfz6SdvkrFWkGy2Pgc7RAtAVnNZNFeFX70yWcJnFs8X9YEBie2B/zuqq2Vj9P1ue1pFzwWyt6w==", - "engines": { - "node": ">=16", - "npm": ">=8", - "yarn": "please-use-npm" - }, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@pixi/gif/-/gif-3.0.0.tgz", + "integrity": "sha512-0am94k1SEwacW6anOiNT9vt3vnefEaiMxkg30nMwvqU3XkIO6sSsFBgQM3UArjDG/quYsujjyZZkyhl7yBF6GQ==", "peerDependencies": { - "@pixi/core": "^7.0.0-X", - "@pixi/sprite": "^7.0.0-X" - } - }, - "node_modules/@pixi/graphics": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.0.4.tgz", - "integrity": "sha512-k6hnScltWw1dZf6C6/cyKBEUOaddd10AMon2fJbW5a903igirarncDZEg3mrMh0Tku7vIp4o6afZ7a+p0ocptQ==" - }, - "node_modules/@pixi/math": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.0.4.tgz", - "integrity": "sha512-tk9PyqdNi9EB0fjpwVfR4ZPUpuy8UjBqOLwTGM3v4MpAPP6uYK76rZLPSsGpx3Pe7BldS1HDnBC4U6CbK/eebw==" - }, - "node_modules/@pixi/mesh": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.0.4.tgz", - "integrity": "sha512-DIlzG6hKppYl6OucxNNyEGSQHYCa+zPckMEcb9tIW/OkxALM2NyuFCz7lDocNgWHvicsCw3cUs+R12NGSpNsvA==" - }, - "node_modules/@pixi/mesh-extras": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.0.4.tgz", - "integrity": "sha512-nTvg5T5BM1BjKWg0XrO8gxSudPmPAXRLwSjqtNzgmeSsLFN8IN+TCrUq2pb9sbU8yUrT0xqXRfctyPW2lU69ow==" - }, - "node_modules/@pixi/mixin-cache-as-bitmap": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.0.4.tgz", - "integrity": "sha512-ryNsgIQLWR2QkFAtiiCDvAySdZ6qwKGGGLqpVQ2/L0jN05oK8QgBjGYZWFasOe46Dk6cV0PEu8647blS2pkKHA==" - }, - "node_modules/@pixi/mixin-get-child-by-name": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.0.4.tgz", - "integrity": "sha512-XSZXkeIaxOdDeAFQd3LaGdwzy6o6xqW2YgoCU5SXbuz2IlP6Vw8wjD+Zj2Ci/l54/yrm5+Z7er7/8JoPp0hSTg==" - }, - "node_modules/@pixi/mixin-get-global-position": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.0.4.tgz", - "integrity": "sha512-qic8niPQpYr2yKmer6vJYmpCLIjhUl8gaYON7B2gLykyrG8KaAlnx9nP3l5oyWhJWuCGzoPebDg5VA67EOmBvA==" - }, - "node_modules/@pixi/particle-container": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.0.4.tgz", - "integrity": "sha512-Njm8KUX5lCNhffc+pbNFXHZl0Lrl4QY9nctcLr3+I7yFe5O2M3jIEGnnBCKEP2L3FLKqD6YrfllYu3dIy3ts5Q==" - }, - "node_modules/@pixi/prepare": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.0.4.tgz", - "integrity": "sha512-xgM1VNQZRYsrl5ZZw67ALhn+580GqI9UO99yhmM1T3tMsLmpzy78Zpl8jmKEOFFnEGe+9TPwKU9dJnJwFywtQg==" - }, - "node_modules/@pixi/runner": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.0.4.tgz", - "integrity": "sha512-XHtK2FyVk8sg/Uuww0SFVDUMpv0M5sj7zmTLXxgvlDuaHKimDl1d52j2w/N7y4DU8BpyAFTH3VgyTrAMsZBydw==" - }, - "node_modules/@pixi/settings": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.0.4.tgz", - "integrity": "sha512-aEg0BYVLWVXcyUIGhnV0Gsxb/6g9nTaciKEBXm4C/7G10HgEuIrO56P/ccTPl3xcL5g6z417DcntuiNNSQ29Qg==", - "dependencies": { - "@pixi/constants": "7.0.4", - "@types/css-font-loading-module": "^0.0.7" + "pixi.js": "^8.0.0" } }, "node_modules/@pixi/sound": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@pixi/sound/-/sound-5.0.0.tgz", - "integrity": "sha512-bBtAPbIy5x851WwEHGccvlli0PQbgzRkEOR8V5gfUtUwGRjPnOwpw/Jalc/TbTgauN+tysiR/0PAAlMctrbRaQ==", - "engines": { - "node": ">=12", - "npm": ">=7", - "yarn": "please-use-npm" - }, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@pixi/sound/-/sound-6.0.0.tgz", + "integrity": "sha512-fEaCs2JmyYT1qqouFS3DydSccI35dyYD0pKK2hEbIGVDKUTvl224x0p4qme2YU9l465WRtM7gspLzP5fFf1mxQ==", "peerDependencies": { - "@pixi/assets": "^7.0.0-X", - "@pixi/core": "^7.0.0-X" - } - }, - "node_modules/@pixi/sprite": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.0.4.tgz", - "integrity": "sha512-Bj6pswIKfHdk5q0G14cBZF8XXyf0zHgUxpp53rD2+tDKf4Xm2/Uoy5p0Z1RZD6IzaFp44pKA21LYOPJrNxc1MA==" - }, - "node_modules/@pixi/sprite-animated": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.0.4.tgz", - "integrity": "sha512-cDhIg6jSkl4+U7oRnqSkoSlQ8h7GuWRt12DNlm/pMOwN6r7DjrVkbQH9cBHB3k6dZxp0SwhrLxXwtk6XoeNRPA==" - }, - "node_modules/@pixi/sprite-tiling": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.0.4.tgz", - "integrity": "sha512-3tzOjZr3fj7T/NfNRQP/fSaBrJvUh260rHdSlwANzc0DY8qNXprU2pEUO3YaIYWgp5ubq/Ls7XNwrWLPHZQraA==" - }, - "node_modules/@pixi/spritesheet": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.0.4.tgz", - "integrity": "sha512-wWaymCrIXWVXq/tWc6mzHBs3iqiWULvApVQ/vbQTXU17O5tZFp36vmFewYVTMOJTWkRmDJg5VedPk1QmvQlL3g==" - }, - "node_modules/@pixi/text": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.0.4.tgz", - "integrity": "sha512-CaAgUNbbZ38E4+Ze1lZ2j4vtq4lWoOFprreUc+M+vshRkoS6JgxGTBO+Z9dutQzPfYaZFL7M+Q2reX5l78RU4g==" - }, - "node_modules/@pixi/text-bitmap": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.0.4.tgz", - "integrity": "sha512-Oi4pwpw11uUz9Ah/5JuXMqYjTQ/5wawXYsi1H0eayrU+w0vv8WKqvOPWjRZhixNgEsVHbwPMjYpXCecqQfg6gA==" - }, - "node_modules/@pixi/ticker": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.0.4.tgz", - "integrity": "sha512-0d1KjkftfJvwaVIv4h3KHYWvdHmSHt9yHgczmp9NzH+9i9sRQbmb7IK/WxFORYFfYbYrPpMVDOkrxvEAUosunw==", - "dependencies": { - "@pixi/extensions": "7.0.4", - "@pixi/settings": "7.0.4" - } - }, - "node_modules/@pixi/utils": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.0.4.tgz", - "integrity": "sha512-fdPhfItjnwKgkb8l27zD4eCwGrSCa72kqYWEtwYayVNSh+l95krLQPZHrXR2HA7Rh97I8/4PUJBhIIcEaI962Q==", - "dependencies": { - "@pixi/constants": "7.0.4", - "@pixi/settings": "7.0.4", - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^4.0.0", - "url": "^0.11.0" + "pixi.js": "^8.0.0" } }, "node_modules/@tweenjs/tween.js": { @@ -487,9 +272,9 @@ } }, "node_modules/@types/css-font-loading-module": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", - "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==" + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==" }, "node_modules/@types/dat.gui": { "version": "0.7.7", @@ -498,9 +283,9 @@ "dev": true }, "node_modules/@types/earcut": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.1.tgz", - "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==" }, "node_modules/@types/fs-extra": { "version": "8.1.2", @@ -523,17 +308,25 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==" - }, "node_modules/@types/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", "dev": true }, + "node_modules/@webgpu/types": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.40.tgz", + "integrity": "sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw==" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -1188,9 +981,9 @@ } }, "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/fd-slicer": { "version": "1.1.0", @@ -1392,6 +1185,11 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==" + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -1578,6 +1376,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1624,43 +1427,19 @@ "dev": true }, "node_modules/pixi.js": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.0.4.tgz", - "integrity": "sha512-5j9AVVNjPfuUK7HDvkoOGbMwZiQvBZORLpjR3Rl+hr88unXs92/Ud4e2Px7pnSDQfxHiGzKwbiMFuvTL94Yk6g==", - "dependencies": { - "@pixi/accessibility": "7.0.4", - "@pixi/app": "7.0.4", - "@pixi/assets": "7.0.4", - "@pixi/compressed-textures": "7.0.4", - "@pixi/core": "7.0.4", - "@pixi/display": "7.0.4", - "@pixi/events": "7.0.4", - "@pixi/extensions": "7.0.4", - "@pixi/extract": "7.0.4", - "@pixi/filter-alpha": "7.0.4", - "@pixi/filter-blur": "7.0.4", - "@pixi/filter-color-matrix": "7.0.4", - "@pixi/filter-displacement": "7.0.4", - "@pixi/filter-fxaa": "7.0.4", - "@pixi/filter-noise": "7.0.4", - "@pixi/graphics": "7.0.4", - "@pixi/mesh": "7.0.4", - "@pixi/mesh-extras": "7.0.4", - "@pixi/mixin-cache-as-bitmap": "7.0.4", - "@pixi/mixin-get-child-by-name": "7.0.4", - "@pixi/mixin-get-global-position": "7.0.4", - "@pixi/particle-container": "7.0.4", - "@pixi/prepare": "7.0.4", - "@pixi/sprite": "7.0.4", - "@pixi/sprite-animated": "7.0.4", - "@pixi/sprite-tiling": "7.0.4", - "@pixi/spritesheet": "7.0.4", - "@pixi/text": "7.0.4", - "@pixi/text-bitmap": "7.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.0.1.tgz", + "integrity": "sha512-SGtkod644kb/k+hTvSSk9ywpmvgdjiX+gK6NF8He1xyQ0XCRn5ZqN37EPEBsg0ffadjZ40mqtO+2oXyEOLrWzw==", + "dependencies": { + "@pixi/colord": "^2.9.6", + "@types/css-font-loading-module": "^0.0.12", + "@types/earcut": "^2.1.4", + "@webgpu/types": "^0.1.40", + "@xmldom/xmldom": "^0.8.10", + "earcut": "^2.2.4", + "eventemitter3": "^5.0.1", + "ismobilejs": "^1.1.1", + "parse-svg-path": "^0.1.2" } }, "node_modules/plist": { @@ -1722,20 +1501,6 @@ "node": ">=6" } }, - "node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/readable-stream": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", @@ -2078,15 +1843,6 @@ "node": ">=8" } }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2437,222 +2193,23 @@ "wrap-ansi": "^7.0.0" } }, - "@pixi/accessibility": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.0.4.tgz", - "integrity": "sha512-ExwRleeR1uWAOsbMg1bshh7OwYsnecIRpxdtkSYcxcCkk0ZNyjm6Z4WrQ3B170DpGMUy/5cZa6WnVok0a2OxMA==" - }, - "@pixi/app": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.0.4.tgz", - "integrity": "sha512-HXQHcLFNKm1d1IY0i2VigwgVxLO0ODS29TPhQv4m1q/w7FbgW2dWa0oDQS0ei0Bl/tlExd296YSrGfnbfw4Ypw==" - }, - "@pixi/assets": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.0.4.tgz", - "integrity": "sha512-SsF8oVY3FTBP5sy2KkrmYhlN3NNQSKdo+pttqWzuNA0bfl431q/6dytSYTWOHkKwhk5n+eAIZflQVuBht4X4aA==", - "requires": { - "@types/css-font-loading-module": "^0.0.7" - } - }, - "@pixi/compressed-textures": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.0.4.tgz", - "integrity": "sha512-N04PAsvRqGL1WhFmr3A+qCWAlJuJOxMr04w3eLY+gD9a5fQjB8XYgeeEOuz/hJ+qWRFhGwhYUo2F0MrQg5d24Q==" - }, - "@pixi/constants": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.0.4.tgz", - "integrity": "sha512-HS8fvDZ4jn7jeEPeYfrB0bPSLW6yfVWxQwXUX6BAQOhpEZXlPpa3uKwl+wxhVh+9OGXBvlMcbxZTPEDMdB6xJQ==" - }, - "@pixi/core": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.0.4.tgz", - "integrity": "sha512-tM0Cz8r9EFivBoGnYQ1043of9Qp4Usr7YQ0vK29rF2HInNannrTFO2F/tXBoClRsCJUw0Y2R8C4n06tAovGiWg==", - "requires": { - "@pixi/constants": "7.0.4", - "@pixi/extensions": "7.0.4", - "@pixi/math": "7.0.4", - "@pixi/runner": "7.0.4", - "@pixi/settings": "7.0.4", - "@pixi/ticker": "7.0.4", - "@pixi/utils": "7.0.4", - "@types/offscreencanvas": "^2019.6.4" - } - }, - "@pixi/display": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.0.4.tgz", - "integrity": "sha512-mYz1j+bIOqDdd3tR7/B6hhCgfY1fvkGsCcespW3y8i3dHBgcO/PFggmpy3Op4yx/b2f8w4HkCm8ssvwx585kxg==" - }, - "@pixi/events": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.0.4.tgz", - "integrity": "sha512-EQyEeo8ajsHgvDY9MqnI8V6D+/9cJDZZvjDAAMVeVs5W3aJ05LcWEXRRL9CnlwLld0qfuv2eFbeHznl0yMVXXg==" - }, - "@pixi/extensions": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.0.4.tgz", - "integrity": "sha512-NRwQ+R1nctH98u0h4mUTwYsqC72t7MakUPgJ8b51HslMAHerfqhymntX/E4f3pFuulSWAnsbR5sEVAee9b1XDw==" - }, - "@pixi/extract": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.0.4.tgz", - "integrity": "sha512-fchsSpkxHDQBKlQHwF0bVH69ZhI1Z+2rRoZn6ninAMU9QrliUSotrQDrq9Oh0kJAQUmBaQClnEM9IFDzIHwV2A==" - }, - "@pixi/filter-alpha": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.0.4.tgz", - "integrity": "sha512-IgBLVZQVryGVVAEvcrmj13VYnSBS57z6eRKi4QPjrpAzv1G4dP1nJSgT8HQjn18OF/UN7dfxt21Y3fsG7o+y/Q==" - }, - "@pixi/filter-blur": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.0.4.tgz", - "integrity": "sha512-zzgDN9ipooPNbLm3CbtqL+/rN92Gml0oOYWUDy7qulTlHDCXw8BRZ6RnWnY6KBZS3LzuSIGv0GLXYdeBGnY+6w==" - }, - "@pixi/filter-color-matrix": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.0.4.tgz", - "integrity": "sha512-ROT4QCTRnCm1AwE5zdU0PPK1vDrtJHNF3FSRJ+qEGgRVRoG4io6uh8AaM6PAqDpAODLp4TN45eU25Sg6Q4A/rQ==" - }, - "@pixi/filter-displacement": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.0.4.tgz", - "integrity": "sha512-tSX78DqsjdQQmpGAFBONcO40jx/Ia4FT1KxPAN2TTzhOxjNK9mbe/wlP01Sw2t3uiKj6xKLeQS80dyKMulhrUQ==" - }, - "@pixi/filter-fxaa": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.0.4.tgz", - "integrity": "sha512-wVdhDJgAbWQs+bEcZ26dNBApuDsyHqsrSkNhn4lVl7i3Hc1xm505w7aWWT/6rL9cR6S5W3ss/k6kSahbjmVBIg==" - }, - "@pixi/filter-noise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.0.4.tgz", - "integrity": "sha512-UBsBaLFV0v5KGvcDCsaRyrNZXHirFLVdGgwPbeDpiJLvyPu1bTfoxeImu+c8okKivwbho2oomXIU374KFa/BvA==" + "@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==" }, "@pixi/gif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@pixi/gif/-/gif-2.0.1.tgz", - "integrity": "sha512-hs3WgJvQfTYnZfz6SdvkrFWkGy2Pgc7RAtAVnNZNFeFX70yWcJnFs8X9YEBie2B/zuqq2Vj9P1ue1pFzwWyt6w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@pixi/gif/-/gif-3.0.0.tgz", + "integrity": "sha512-0am94k1SEwacW6anOiNT9vt3vnefEaiMxkg30nMwvqU3XkIO6sSsFBgQM3UArjDG/quYsujjyZZkyhl7yBF6GQ==", "requires": {} }, - "@pixi/graphics": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.0.4.tgz", - "integrity": "sha512-k6hnScltWw1dZf6C6/cyKBEUOaddd10AMon2fJbW5a903igirarncDZEg3mrMh0Tku7vIp4o6afZ7a+p0ocptQ==" - }, - "@pixi/math": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.0.4.tgz", - "integrity": "sha512-tk9PyqdNi9EB0fjpwVfR4ZPUpuy8UjBqOLwTGM3v4MpAPP6uYK76rZLPSsGpx3Pe7BldS1HDnBC4U6CbK/eebw==" - }, - "@pixi/mesh": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.0.4.tgz", - "integrity": "sha512-DIlzG6hKppYl6OucxNNyEGSQHYCa+zPckMEcb9tIW/OkxALM2NyuFCz7lDocNgWHvicsCw3cUs+R12NGSpNsvA==" - }, - "@pixi/mesh-extras": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.0.4.tgz", - "integrity": "sha512-nTvg5T5BM1BjKWg0XrO8gxSudPmPAXRLwSjqtNzgmeSsLFN8IN+TCrUq2pb9sbU8yUrT0xqXRfctyPW2lU69ow==" - }, - "@pixi/mixin-cache-as-bitmap": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.0.4.tgz", - "integrity": "sha512-ryNsgIQLWR2QkFAtiiCDvAySdZ6qwKGGGLqpVQ2/L0jN05oK8QgBjGYZWFasOe46Dk6cV0PEu8647blS2pkKHA==" - }, - "@pixi/mixin-get-child-by-name": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.0.4.tgz", - "integrity": "sha512-XSZXkeIaxOdDeAFQd3LaGdwzy6o6xqW2YgoCU5SXbuz2IlP6Vw8wjD+Zj2Ci/l54/yrm5+Z7er7/8JoPp0hSTg==" - }, - "@pixi/mixin-get-global-position": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.0.4.tgz", - "integrity": "sha512-qic8niPQpYr2yKmer6vJYmpCLIjhUl8gaYON7B2gLykyrG8KaAlnx9nP3l5oyWhJWuCGzoPebDg5VA67EOmBvA==" - }, - "@pixi/particle-container": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.0.4.tgz", - "integrity": "sha512-Njm8KUX5lCNhffc+pbNFXHZl0Lrl4QY9nctcLr3+I7yFe5O2M3jIEGnnBCKEP2L3FLKqD6YrfllYu3dIy3ts5Q==" - }, - "@pixi/prepare": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.0.4.tgz", - "integrity": "sha512-xgM1VNQZRYsrl5ZZw67ALhn+580GqI9UO99yhmM1T3tMsLmpzy78Zpl8jmKEOFFnEGe+9TPwKU9dJnJwFywtQg==" - }, - "@pixi/runner": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.0.4.tgz", - "integrity": "sha512-XHtK2FyVk8sg/Uuww0SFVDUMpv0M5sj7zmTLXxgvlDuaHKimDl1d52j2w/N7y4DU8BpyAFTH3VgyTrAMsZBydw==" - }, - "@pixi/settings": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.0.4.tgz", - "integrity": "sha512-aEg0BYVLWVXcyUIGhnV0Gsxb/6g9nTaciKEBXm4C/7G10HgEuIrO56P/ccTPl3xcL5g6z417DcntuiNNSQ29Qg==", - "requires": { - "@pixi/constants": "7.0.4", - "@types/css-font-loading-module": "^0.0.7" - } - }, "@pixi/sound": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@pixi/sound/-/sound-5.0.0.tgz", - "integrity": "sha512-bBtAPbIy5x851WwEHGccvlli0PQbgzRkEOR8V5gfUtUwGRjPnOwpw/Jalc/TbTgauN+tysiR/0PAAlMctrbRaQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@pixi/sound/-/sound-6.0.0.tgz", + "integrity": "sha512-fEaCs2JmyYT1qqouFS3DydSccI35dyYD0pKK2hEbIGVDKUTvl224x0p4qme2YU9l465WRtM7gspLzP5fFf1mxQ==", "requires": {} }, - "@pixi/sprite": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.0.4.tgz", - "integrity": "sha512-Bj6pswIKfHdk5q0G14cBZF8XXyf0zHgUxpp53rD2+tDKf4Xm2/Uoy5p0Z1RZD6IzaFp44pKA21LYOPJrNxc1MA==" - }, - "@pixi/sprite-animated": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.0.4.tgz", - "integrity": "sha512-cDhIg6jSkl4+U7oRnqSkoSlQ8h7GuWRt12DNlm/pMOwN6r7DjrVkbQH9cBHB3k6dZxp0SwhrLxXwtk6XoeNRPA==" - }, - "@pixi/sprite-tiling": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.0.4.tgz", - "integrity": "sha512-3tzOjZr3fj7T/NfNRQP/fSaBrJvUh260rHdSlwANzc0DY8qNXprU2pEUO3YaIYWgp5ubq/Ls7XNwrWLPHZQraA==" - }, - "@pixi/spritesheet": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.0.4.tgz", - "integrity": "sha512-wWaymCrIXWVXq/tWc6mzHBs3iqiWULvApVQ/vbQTXU17O5tZFp36vmFewYVTMOJTWkRmDJg5VedPk1QmvQlL3g==" - }, - "@pixi/text": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.0.4.tgz", - "integrity": "sha512-CaAgUNbbZ38E4+Ze1lZ2j4vtq4lWoOFprreUc+M+vshRkoS6JgxGTBO+Z9dutQzPfYaZFL7M+Q2reX5l78RU4g==" - }, - "@pixi/text-bitmap": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.0.4.tgz", - "integrity": "sha512-Oi4pwpw11uUz9Ah/5JuXMqYjTQ/5wawXYsi1H0eayrU+w0vv8WKqvOPWjRZhixNgEsVHbwPMjYpXCecqQfg6gA==" - }, - "@pixi/ticker": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.0.4.tgz", - "integrity": "sha512-0d1KjkftfJvwaVIv4h3KHYWvdHmSHt9yHgczmp9NzH+9i9sRQbmb7IK/WxFORYFfYbYrPpMVDOkrxvEAUosunw==", - "requires": { - "@pixi/extensions": "7.0.4", - "@pixi/settings": "7.0.4" - } - }, - "@pixi/utils": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.0.4.tgz", - "integrity": "sha512-fdPhfItjnwKgkb8l27zD4eCwGrSCa72kqYWEtwYayVNSh+l95krLQPZHrXR2HA7Rh97I8/4PUJBhIIcEaI962Q==", - "requires": { - "@pixi/constants": "7.0.4", - "@pixi/settings": "7.0.4", - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^4.0.0", - "url": "^0.11.0" - } - }, "@tweenjs/tween.js": { "version": "18.6.4", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", @@ -2674,9 +2231,9 @@ } }, "@types/css-font-loading-module": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", - "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==" + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==" }, "@types/dat.gui": { "version": "0.7.7", @@ -2685,9 +2242,9 @@ "dev": true }, "@types/earcut": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.1.tgz", - "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==" }, "@types/fs-extra": { "version": "8.1.2", @@ -2710,17 +2267,22 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==" - }, "@types/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", "dev": true }, + "@webgpu/types": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.40.tgz", + "integrity": "sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw==" + }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==" + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -3100,9 +2662,9 @@ "optional": true }, "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "fd-slicer": { "version": "1.1.0", @@ -3257,6 +2819,11 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==" + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -3395,6 +2962,11 @@ "is-wsl": "^2.2.0" } }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3432,39 +3004,19 @@ "dev": true }, "pixi.js": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.0.4.tgz", - "integrity": "sha512-5j9AVVNjPfuUK7HDvkoOGbMwZiQvBZORLpjR3Rl+hr88unXs92/Ud4e2Px7pnSDQfxHiGzKwbiMFuvTL94Yk6g==", - "requires": { - "@pixi/accessibility": "7.0.4", - "@pixi/app": "7.0.4", - "@pixi/assets": "7.0.4", - "@pixi/compressed-textures": "7.0.4", - "@pixi/core": "7.0.4", - "@pixi/display": "7.0.4", - "@pixi/events": "7.0.4", - "@pixi/extensions": "7.0.4", - "@pixi/extract": "7.0.4", - "@pixi/filter-alpha": "7.0.4", - "@pixi/filter-blur": "7.0.4", - "@pixi/filter-color-matrix": "7.0.4", - "@pixi/filter-displacement": "7.0.4", - "@pixi/filter-fxaa": "7.0.4", - "@pixi/filter-noise": "7.0.4", - "@pixi/graphics": "7.0.4", - "@pixi/mesh": "7.0.4", - "@pixi/mesh-extras": "7.0.4", - "@pixi/mixin-cache-as-bitmap": "7.0.4", - "@pixi/mixin-get-child-by-name": "7.0.4", - "@pixi/mixin-get-global-position": "7.0.4", - "@pixi/particle-container": "7.0.4", - "@pixi/prepare": "7.0.4", - "@pixi/sprite": "7.0.4", - "@pixi/sprite-animated": "7.0.4", - "@pixi/sprite-tiling": "7.0.4", - "@pixi/spritesheet": "7.0.4", - "@pixi/text": "7.0.4", - "@pixi/text-bitmap": "7.0.4" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.0.1.tgz", + "integrity": "sha512-SGtkod644kb/k+hTvSSk9ywpmvgdjiX+gK6NF8He1xyQ0XCRn5ZqN37EPEBsg0ffadjZ40mqtO+2oXyEOLrWzw==", + "requires": { + "@pixi/colord": "^2.9.6", + "@types/css-font-loading-module": "^0.0.12", + "@types/earcut": "^2.1.4", + "@webgpu/types": "^0.1.40", + "@xmldom/xmldom": "^0.8.10", + "earcut": "^2.2.4", + "eventemitter3": "^5.0.1", + "ismobilejs": "^1.1.1", + "parse-svg-path": "^0.1.2" } }, "plist": { @@ -3506,16 +3058,6 @@ } } }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" - }, "readable-stream": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", @@ -3753,15 +3295,6 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 582ec34..fda6725 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,11 @@ "dependencies": { "@capacitor/android": "^4.7.0", "@capacitor/core": "^4.7.0", - "@pixi/gif": "^2.0.1", - "@pixi/sound": "^5.0.0", + "@pixi/gif": "^3.0.0", + "@pixi/sound": "^6.0.0", "@tweenjs/tween.js": "^18.6.4", "dat.gui": "^0.7.9", "matter-js": "^0.18.0", - "pixi.js": "^7.0.4" + "pixi.js": "^8.0.1" } } diff --git a/src/GameLauncher.ts b/src/GameLauncher.ts index 29e1bd8..7729119 100644 --- a/src/GameLauncher.ts +++ b/src/GameLauncher.ts @@ -5,6 +5,9 @@ import { getStageSize } from "./main"; import { MonsterRaidersGame } from "./monster-raiders/MonsterRaidersGame"; import { SpaceInvadersGame } from "./space-invaders/SpaceInvadersGame"; import { TreeGenerator } from "./tree-generator/TreeGenerator"; +import { monsterRaiderPreload } from "./monster-raiders/monsterRaiderPreload"; +import { spaceInvadersPreload } from "./space-invaders/spaceInvadersPreload"; +import { castleFallsPreload } from "./castle-falls/castleFallsPreload"; export class GameLauncher extends Container { @@ -16,13 +19,16 @@ export class GameLauncher extends Container { this.createButton('小樹枝上開朵花', 80, () => { new TreeGenerator(app); }); - this.createButton('經典小蜜蜂', 160, () => { + this.createButton('經典小蜜蜂', 160, async () => { + await spaceInvadersPreload(); new SpaceInvadersGame(app); }); - this.createButton('怪獸掃蕩隊', 240, () => { + this.createButton('怪獸掃蕩隊', 240, async () => { + await monsterRaiderPreload(); new MonsterRaidersGame(app); }); - this.createButton('魔王城的隕落', 320, () => { + this.createButton('魔王城的隕落', 320, async () => { + await castleFallsPreload(); new CastleFalls(app); }); } diff --git a/src/castle-falls/CastleFallsGame.ts b/src/castle-falls/CastleFallsGame.ts index 89025bc..e0edc71 100644 --- a/src/castle-falls/CastleFallsGame.ts +++ b/src/castle-falls/CastleFallsGame.ts @@ -1,7 +1,6 @@ import { Engine, Events, IEventCollision, Runner } from "matter-js"; import { Container, Sprite, Text } from "pixi.js"; import { CastleFalls } from "./CastleFalls"; -import bgImg from "../images/castle-gamebg.png"; import { ICastleFallsLevelData, ICFObject } from "./CastleFallsLevelData"; import { Slingshot } from "./Slingshot"; import { MatterRender } from "../lib/matter/MatterRender"; @@ -46,7 +45,7 @@ export class CastleFallsGame extends Container { return this.gameApp.app; } addBackground() { - var bg = Sprite.from(bgImg); + var bg = Sprite.from('gameBgImg'); bg.zIndex = 0; this.addChild(bg); } @@ -124,11 +123,16 @@ export class CastleFallsGame extends Container { // 取得遊戲舞台尺寸 const stageSize = getStageSize(); // 建立過關文字 - let text = new Text("The Castle has Fallen", { - fontSize: 32, - fill: 0xFFFFFF, - stroke: 0x000000, - strokeThickness: 5, + let text = new Text({ + text: "The Castle has Fallen", + style: { + fontSize: 32, + fill: 0xFFFFFF, + stroke: { + color: 0x000000, + width: 5, + }, + } }); // 調整軸心至文字中央的底部 text.pivot.set(text.width / 2, text.height / 2); diff --git a/src/castle-falls/LevelsUI.ts b/src/castle-falls/LevelsUI.ts index 8868a75..cef173c 100644 --- a/src/castle-falls/LevelsUI.ts +++ b/src/castle-falls/LevelsUI.ts @@ -1,6 +1,5 @@ import { CastleFalls } from "./CastleFalls"; import { Container, Sprite } from "pixi.js"; -import castleBgImg from "../images/castle-bg.jpg"; import { PixiButton } from "../lib/PixiButton"; export class LevelsUI extends Container { @@ -8,7 +7,7 @@ export class LevelsUI extends Container { constructor(public gameApp: CastleFalls) { super(); // 加入介面背景圖 - let bg = Sprite.from(castleBgImg); + let bg = Sprite.from('castleBgImg'); bg.scale.set(0.5); this.addChild(bg); // 建構選關按鈕 diff --git a/src/castle-falls/MatterObject.ts b/src/castle-falls/MatterObject.ts index c1aae67..0f087eb 100644 --- a/src/castle-falls/MatterObject.ts +++ b/src/castle-falls/MatterObject.ts @@ -1,12 +1,7 @@ import { Bodies, Body, Composite, Events, Pair, Vector } from "matter-js"; -import { Container, Sprite, TilingSprite } from "pixi.js"; +import { Assets, Container, Sprite, TilingSprite } from "pixi.js"; import { CastleFallsGame } from "./CastleFallsGame"; import { BodyOptionsMap, ICFObject } from "./CastleFallsLevelData"; -import groundImg from "../images/castle-ground.png"; -import brickImg from "../images/castle-brick.png"; -import woodImg from "../images/castle-wood.png"; -import bossImg from "../images/castle-boss.png"; -import rockImg from "../images/castle-rock.png"; import poofGif from "../images/poof.gif"; import { gifFrom } from "../lib/PixiGifUtils"; @@ -16,7 +11,7 @@ export class MatterObject extends Container { body: Body; // Matter.js剛體 - sprite: Sprite; // PIXI精靈圖 + sprite: Container; // PIXI精靈圖 constructor(public game: CastleFallsGame, public data: ICFObject) { super(); @@ -76,11 +71,11 @@ export class MatterObject extends Container { throw new Error('Unknown body shape.'); } } - private createSprite(data: ICFObject): Sprite { + private createSprite(data: ICFObject): Container { if (data.type == 'ground') { const rect = data.rect!; let sprite = TilingSprite.from( - groundImg, + Assets.get('groundImg'), { width: rect.width, height: rect.height } ); sprite.pivot.set(sprite.width / 2, sprite.height / 2); @@ -91,7 +86,7 @@ export class MatterObject extends Container { } if (data.type == 'brick') { const rect = data.rect!; - let sprite = Sprite.from(brickImg); + let sprite = Sprite.from('brickImg'); sprite.pivot.set(42, 21); sprite.width = rect.width; sprite.height = rect.height; @@ -100,7 +95,7 @@ export class MatterObject extends Container { } if (data.type == 'wood') { const rect = data.rect!; - let sprite = Sprite.from(woodImg); + let sprite = Sprite.from('woodImg'); sprite.pivot.set(42, 21); sprite.width = rect.width; sprite.height = rect.height; @@ -109,7 +104,7 @@ export class MatterObject extends Container { } if (data.type == 'boss') { const circle = data.circle!; - let sprite = Sprite.from(bossImg); + let sprite = Sprite.from('bossImg'); sprite.pivot.set(36, 48); sprite.scale.set(circle.radius / 32); this.zIndex = 3; @@ -117,7 +112,7 @@ export class MatterObject extends Container { } if (data.type == 'rock') { const circle = data.circle!; - let sprite = Sprite.from(rockImg); + let sprite = Sprite.from('rockImg'); sprite.pivot.set(38, 36); sprite.scale.set(circle.radius / 36); this.zIndex = 6; diff --git a/src/castle-falls/Slingshot.ts b/src/castle-falls/Slingshot.ts index aa0f18c..ba56f0a 100644 --- a/src/castle-falls/Slingshot.ts +++ b/src/castle-falls/Slingshot.ts @@ -3,8 +3,6 @@ import { ICFSlingshot } from "./CastleFallsLevelData"; import { Sprite } from "pixi.js"; import { wait } from "../main"; import { CastleFallsGame } from "./CastleFallsGame"; -import slingshotImg from "../images/slingshot.png"; -import slingshotFrontImg from "../images/slingshot_front.png"; import shootSnd from "../sounds/missile-launch.mp3"; import { playSound } from "../lib/SoundUtils"; @@ -88,12 +86,12 @@ export class Slingshot { } private createSprites(data: ICFSlingshot): void { // 彈弓主體 - let backSprite = Sprite.from(slingshotImg); + let backSprite = Sprite.from('slingshotImg'); backSprite.zIndex = 0; backSprite.position.set(data.x - 35, data.y - 15); this.game.addChild(backSprite); // 能遮住石塊的木段 - let frontSprite = Sprite.from(slingshotFrontImg); + let frontSprite = Sprite.from('slingshotFrontImg'); frontSprite.zIndex = 10; frontSprite.position.copyFrom(backSprite.position); this.game.addChild(frontSprite); @@ -118,7 +116,7 @@ export class Slingshot { }); } private createMouseConstraint(): MouseConstraint { - let canvas = this.game.app.view as HTMLCanvasElement; + let canvas = this.game.app.canvas as HTMLCanvasElement; // 建立Matter滑鼠,使用Pixi畫板接收滑鼠事件 let mouse = Mouse.create(canvas); // 調整Matter滑鼠的位置 diff --git a/src/castle-falls/castleFallsPreload.ts b/src/castle-falls/castleFallsPreload.ts new file mode 100644 index 0000000..fb51964 --- /dev/null +++ b/src/castle-falls/castleFallsPreload.ts @@ -0,0 +1,27 @@ +import gameBgImg from "../images/castle-gamebg.png"; +import castleBgImg from "../images/castle-bg.jpg"; +import groundImg from "../images/castle-ground.png"; +import brickImg from "../images/castle-brick.png"; +import woodImg from "../images/castle-wood.png"; +import bossImg from "../images/castle-boss.png"; +import rockImg from "../images/castle-rock.png"; +import slingshotImg from "../images/slingshot.png"; +import slingshotFrontImg from "../images/slingshot_front.png"; +import { Assets } from "pixi.js"; + +export async function castleFallsPreload() { + + let assets = [ + { alias: 'gameBgImg', src: gameBgImg }, + { alias: 'castleBgImg', src: castleBgImg }, + { alias: 'groundImg', src: groundImg }, + { alias: 'brickImg', src: brickImg }, + { alias: 'woodImg', src: woodImg }, + { alias: 'bossImg', src: bossImg }, + { alias: 'rockImg', src: rockImg }, + { alias: 'slingshotImg', src: slingshotImg }, + { alias: 'slingshotFrontImg', src: slingshotFrontImg }, + ]; + Assets.add(assets); + await Assets.load(assets.map(asset => asset.alias)); +} diff --git a/src/lib/PixiButton.ts b/src/lib/PixiButton.ts index ff94153..62a1b77 100644 --- a/src/lib/PixiButton.ts +++ b/src/lib/PixiButton.ts @@ -38,20 +38,22 @@ export class PixiButton extends Container { const labelColor = options.labelColor; // 幫按鈕加上圓角方形的背景 let bg = new Graphics(); - bg.beginFill(0xFFFFFF); - bg.drawRoundedRect( + bg.roundRect( 0, 0, options.width, options.height, options.cornerRadius ); - bg.endFill(); + bg.fill(0xFFFFFF); // 預設的按鈕背景底色 bg.tint = backgroundColor.default; this.addChild(bg); // 加再上遊戲名字作為按鈕標籤 - let label = new Text(options.label, { - fontSize: options.labelSize, - fill: labelColor.default, + let label = new Text({ + text: options.label, + style: { + fontSize: options.labelSize, + fill: labelColor.default, + } }); label.resolution = 2; // 置中按鈕標籤 diff --git a/src/lib/PixiGifUtils.ts b/src/lib/PixiGifUtils.ts index 6132f9c..3d8e4cf 100644 --- a/src/lib/PixiGifUtils.ts +++ b/src/lib/PixiGifUtils.ts @@ -8,7 +8,7 @@ export async function gifFrom( // 如果source是ArrayBuffer if (source instanceof ArrayBuffer) { // 直接產生AnimatedGIF - let gif = AnimatedGIF.fromBuffer(source); + let gif = AnimatedGIF.fromBuffer(source, options); return Promise.resolve(gif); } else { // 使用Pixi的Assets資源管理系統載入GIF diff --git a/src/lib/PointUtils.ts b/src/lib/PointUtils.ts index 2342a4c..49947f7 100644 --- a/src/lib/PointUtils.ts +++ b/src/lib/PointUtils.ts @@ -1,45 +1,50 @@ -import { IPoint, ObservablePoint, Point } from 'pixi.js' +import { ObservablePoint, Point } from "pixi.js"; +import 'pixi.js/math-extras'; declare module "pixi.js" { - interface IPoint { + interface OurPoint { /** 計算向量的長度 */ length(): number /** 加另一個向量,回傳新的向量 */ - add(other: IPoint): Point + // add(other: Point): Point /** 減另一個向量,回傳新的向量 */ - sub(other: IPoint): Point + // sub(other: Point): Point /** 縮放向量 */ scale(value: number): void /** 將向量正規化,並回傳原本的向量長度 */ - normalize(length?: number): number + // normalize(length?: number): number /** 計算距離另一個座標的距離 */ - distanceTo(other: IPoint): number + distanceTo(other: Point): number /** 將向量旋轉一個角度 */ rotate(rotation: number): this /** 計算向量的內積(dot) */ - dot(other: IPoint): number + // dot(other: Point): number /** 計算向量的行列式(determinant) */ - det(other: IPoint): number + det(other: Point): number } + interface Point extends OurPoint { + } + interface ObservablePoint extends OurPoint { + + } } Point.prototype.length = function () { - return Math.sqrt( - this.x * this.x + this.y * this.y - ) + return this.magnitude(); } + ObservablePoint.prototype.length = Point.prototype.length; -Point.prototype.add = function (other: IPoint) { - return new Point(this.x + other.x, this.y + other.y); -} -ObservablePoint.prototype.add = Point.prototype.add; +// Point.prototype.add = function (other: Point) { +// return new Point(this.x + other.x, this.y + other.y); +// } +// ObservablePoint.prototype.add = Point.prototype.add; -Point.prototype.sub = function (other: IPoint) { - return new Point(this.x - other.x, this.y - other.y); -} -ObservablePoint.prototype.sub = Point.prototype.sub; +// Point.prototype.sub = function (other: Point) { +// return new Point(this.x - other.x, this.y - other.y); +// } +// ObservablePoint.prototype.sub = Point.prototype.sub; Point.prototype.scale = function (value: number) { this.x *= value; @@ -47,17 +52,17 @@ Point.prototype.scale = function (value: number) { } ObservablePoint.prototype.scale = Point.prototype.scale; -Point.prototype.normalize = function(length: number = 1) { - let originLength = this.length(); - // 如果向量原長不是0才有辦法調整長度 - if (originLength != 0) { - this.scale(length / originLength); - } - return originLength; -} -ObservablePoint.prototype.normalize = Point.prototype.normalize; +// Point.prototype.normalize = function (length: number = 1) { +// let originLength = this.length(); +// // 如果向量原長不是0才有辦法調整長度 +// if (originLength != 0) { +// this.scale(length / originLength); +// } +// return originLength; +// } +// ObservablePoint.prototype.normalize = Point.prototype.normalize; -Point.prototype.distanceTo = function(other: IPoint) { +Point.prototype.distanceTo = function (other: Point) { let dx = this.x - other.x; let dy = this.y - other.y; return Math.sqrt(dx * dx + dy * dy); @@ -65,7 +70,7 @@ Point.prototype.distanceTo = function(other: IPoint) { ObservablePoint.prototype.distanceTo = Point.prototype.distanceTo; // 用泛型定義一個通用的旋轉函式 -function vectorRotate(vector: T, rotation: number): T { +function vectorRotate(vector: T, rotation: number): T { let cos = Math.cos(rotation); let sin = Math.sin(rotation); vector.set( @@ -75,20 +80,20 @@ function vectorRotate(vector: T, rotation: number): T { return vector; } // 實作Point的rotate() -Point.prototype.rotate = function(rotation: number) { +Point.prototype.rotate = function (rotation: number) { return vectorRotate(this, rotation); } // 實作ObservablePoint的rotate() -ObservablePoint.prototype.rotate = function(rotation: number) { +ObservablePoint.prototype.rotate = function (rotation: number) { return vectorRotate(this, rotation); } -Point.prototype.dot = function(other: IPoint) { - return this.x * other.x + this.y * other.y; -} -ObservablePoint.prototype.dot = Point.prototype.dot; +// Point.prototype.dot = function (other: Point) { +// return this.x * other.x + this.y * other.y; +// } +// ObservablePoint.prototype.dot = Point.prototype.dot; -Point.prototype.det = function(other: IPoint) { +Point.prototype.det = function (other: Point) { return this.x * other.y - other.x * this.y; } ObservablePoint.prototype.det = Point.prototype.det; diff --git a/src/lib/RectUtils.ts b/src/lib/RectUtils.ts index 3bf3459..00decc5 100644 --- a/src/lib/RectUtils.ts +++ b/src/lib/RectUtils.ts @@ -1,20 +1,20 @@ -import { Rectangle } from "pixi.js"; +// import { Rectangle } from "pixi.js"; -declare module "pixi.js" { - class Rectangle { - /** - * 檢查另一個矩形是否在這個矩形內 - * @param other 另一個矩形 - */ - containsRect(other: Rectangle): boolean; - } -} +// declare module "pixi.js" { +// class Rectangle { +// /** +// * 檢查另一個矩形是否在這個矩形內 +// * @param other 另一個矩形 +// */ +// containsRect(other: Rectangle): boolean; +// } +// } -Rectangle.prototype.containsRect = function(other: Rectangle) { - return ( - other.x >= this.x && - other.y >= this.y && - other.right <= this.right && - other.bottom <= this.bottom - ) -} \ No newline at end of file +// Rectangle.prototype.containsRect = function(other: Rectangle) { +// return ( +// other.x >= this.x && +// other.y >= this.y && +// other.right <= this.right && +// other.bottom <= this.bottom +// ) +// } \ No newline at end of file diff --git a/src/lib/WaitManager.ts b/src/lib/WaitManager.ts index a2b441c..c23a080 100644 --- a/src/lib/WaitManager.ts +++ b/src/lib/WaitManager.ts @@ -31,8 +31,8 @@ export class WaitManager { this.ticker.remove(this.update, this); } - private update(dt: number) { - this.now += dt; + private update(ticker: Ticker) { + this.now += ticker.deltaTime; // 持續loop,直到沒有等待了 while (this.waits.length) { // 取出最前面的等待 diff --git a/src/main.ts b/src/main.ts index b21708c..8a5aa0e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,8 +11,11 @@ import { EventEmitter } from "eventemitter3"; import { GameLauncher } from './GameLauncher'; import { Tween } from '@tweenjs/tween.js'; -let app = new Application(); -document.body.appendChild(app.view); +let app = new Application(); +async function initApp() { + await app.init(); + document.body.appendChild(app.canvas); +} // 使用通用物件來儲存舞台的尺寸 let stageSize = { width: 0, @@ -30,11 +33,11 @@ app.stage.addChild(stageFrame); */ function redrawStageFrame(): void { stageFrame.clear(); // 清除繪圖器 - stageFrame.lineStyle({ + stageFrame.setStrokeStyle({ color: 0xFF0000, width: 2, }); - stageFrame.drawRect( + stageFrame.rect( 0, // x 0, // y stageSize.width, // 寬 @@ -87,8 +90,6 @@ function refreshCanvasAndStage(): void { // 發報舞台改變事件 StageSizeEvents.emit('resize', stageSize); } -// 設定舞台尺寸 -setStageSize(640, 480); // 監聽視窗的 resize 事件 // 在發生改變時執行 refreshCanvasAndStage() window.addEventListener('resize', refreshCanvasAndStage); @@ -108,7 +109,7 @@ export function getStageSize() { } } -let waitManager = new WaitManager(app.ticker); +let waitManager: WaitManager /** * 等待函式 */ @@ -123,8 +124,6 @@ export function waitForTween(tween: Tween) { tween.onComplete(resolve); }); } -/** 啟動滑鼠跟蹤器 */ -startMouseTracer(app); /** * 檢查遊戲是否在觸控螢幕的裝置上運行 */ @@ -138,5 +137,15 @@ export function isOnTouchScreen(): boolean { // new TreeGenerator(app); // new SpaceInvadersGame(app); // new MonsterRaidersGame(app); -new GameLauncher(app); + +async function startup() { + await initApp(); + // 設定舞台尺寸 + setStageSize(640, 480); + /** 啟動滑鼠跟蹤器 */ + startMouseTracer(app); + waitManager = new WaitManager(app.ticker); + new GameLauncher(app); +} +startup(); \ No newline at end of file diff --git a/src/monster-raiders/Astroid.ts b/src/monster-raiders/Astroid.ts index 65310ce..4977ddf 100644 --- a/src/monster-raiders/Astroid.ts +++ b/src/monster-raiders/Astroid.ts @@ -1,6 +1,5 @@ import { SpaceObject } from "./SpaceObject"; -import { Sprite } from "pixi.js"; -import astroidImg from '../images/astroid.png'; +import { Sprite, Ticker } from "pixi.js"; export class Astroid extends SpaceObject { @@ -10,7 +9,7 @@ export class Astroid extends SpaceObject { protected init(): void { // 放一張小行星的圖,並移動軸心到中心 - let sprite = Sprite.from(astroidImg); + let sprite = Sprite.from('astroidImg'); sprite.pivot.set(130, 120); this.addChild(sprite); // 隨機旋轉與縮放,讓每顆小行星看起來不一樣 @@ -28,8 +27,8 @@ export class Astroid extends SpaceObject { // 小行星自轉速度 private rotateSpeed = (Math.random() - 0.5) * 0.004; // 覆寫SpaceObject的update() - update(dt: number) { - this.rotation += this.rotateSpeed * dt; - super.update(dt); + update(ticker: Ticker) { + this.rotation += this.rotateSpeed * ticker.deltaTime; + super.update(ticker); } } diff --git a/src/monster-raiders/Background.ts b/src/monster-raiders/Background.ts index a00d1b5..6855321 100644 --- a/src/monster-raiders/Background.ts +++ b/src/monster-raiders/Background.ts @@ -1,8 +1,6 @@ import { Container, Texture, TilingSprite } from "pixi.js"; import { MonsterRaidersGame } from "./MonsterRaidersGame"; import { FullscreenArea, getStageSize, StageSizeEvents } from "../main"; -import starrySpaceImg from "../images/starry-space.png"; -import starsImg from "../images/stars.png"; export class Background extends Container { @@ -13,20 +11,20 @@ export class Background extends Container { constructor(public game: MonsterRaidersGame) { super(); // 黑底星空 - let texture = Texture.from(starrySpaceImg); - this.starrySprite = new TilingSprite( - texture, - getStageSize().width, - getStageSize().height - ); + let texture = Texture.from('starrySpaceImg'); + this.starrySprite = new TilingSprite({ + texture: texture, + width: getStageSize().width, + height: getStageSize().height, + }); this.addChild(this.starrySprite); this.starrySprite.tileScale.set(0.5); // 星光圖 - this.starsSprite = new TilingSprite( - Texture.from(starsImg), - getStageSize().width, - getStageSize().height - ); + this.starsSprite = new TilingSprite({ + texture: Texture.from('starsImg'), + width: getStageSize().width, + height: getStageSize().height, + }); this.addChild(this.starsSprite); this.starsSprite.tileScale.set(0.8); // 將Background加入遊戲容器的底層 diff --git a/src/monster-raiders/Explosion.ts b/src/monster-raiders/Explosion.ts index 30ab40a..149bc7f 100644 --- a/src/monster-raiders/Explosion.ts +++ b/src/monster-raiders/Explosion.ts @@ -1,6 +1,5 @@ -import { AnimatedSprite, BaseTexture, Container, Rectangle, Texture } from "pixi.js"; +import { AnimatedSprite, Assets, Container, Rectangle, Texture } from "pixi.js"; import { SpaceObject } from "./SpaceObject"; -import explosionImg from "../images/explosion-spritesheet.png"; import fighterExplodeSnd from "../sounds/fighter-explode.mp3"; import monsterExplodeSnd from "../sounds/monster-explode.mp3"; import missileExplodeSnd from "../sounds/missile-explode.mp3"; @@ -60,7 +59,7 @@ function getTextures(): Texture[] { // 若快取是空的,就要建立材質陣列的快取 if (texturesCache.length == 0) { // 載入基底材質 - let baseTexture = BaseTexture.from(explosionImg); + let baseTexture = Assets.get('explosionImg') // 組建48張不同部位的材質 for (let i = 0; i < 48; i++) { let col = i % 8; @@ -71,7 +70,10 @@ function getTextures(): Texture[] { frameSize.width, frameSize.height ); - let texture = new Texture(baseTexture, frame); + let texture = new Texture({ + source: baseTexture, + frame: frame, + }); texturesCache.push(texture); } } diff --git a/src/monster-raiders/Fighter.ts b/src/monster-raiders/Fighter.ts index d87bc38..d1be2c5 100644 --- a/src/monster-raiders/Fighter.ts +++ b/src/monster-raiders/Fighter.ts @@ -7,6 +7,7 @@ import { Explosion } from "./Explosion"; import { Missile } from "./Missile"; import missileSnd from "../sounds/missile-launch.mp3"; import { playSound } from "../lib/SoundUtils"; +import { Ticker } from "pixi.js"; export class Fighter extends SpaceObject { @@ -46,7 +47,7 @@ export class Fighter extends SpaceObject { gif.scale.set(0.5); } - update(dt: number) { + update(ticker: Ticker) { let hitObject = this.hitTestSpaceObject(); if (hitObject) { // 撞到東西了,準備自爆 @@ -64,7 +65,7 @@ export class Fighter extends SpaceObject { this.velocity.set(2, 0); this.velocity.rotate(rotation); } - super.update(dt); + super.update(ticker); } /** 檢測與所有能撞毀戰機太空物件的碰撞 */ hitTestSpaceObject() { diff --git a/src/monster-raiders/Missile.ts b/src/monster-raiders/Missile.ts index 3370a37..186fc3c 100644 --- a/src/monster-raiders/Missile.ts +++ b/src/monster-raiders/Missile.ts @@ -1,6 +1,5 @@ import { SpaceObject } from "./SpaceObject"; -import { Sprite } from "pixi.js"; -import missileImg from "../images/missile.png"; +import { Sprite, Ticker } from "pixi.js"; import { Explosion } from "./Explosion"; export class Missile extends SpaceObject { @@ -11,7 +10,7 @@ export class Missile extends SpaceObject { protected init(): void { // 飛彈的圖 - let sprite = Sprite.from(missileImg); + let sprite = Sprite.from('missileImg'); sprite.pivot.set(15, 4); this.addChild(sprite); // 縮小一點 @@ -36,7 +35,7 @@ export class Missile extends SpaceObject { return isCollidable && obj.hitTest(this); }) } - update(dt: number) { + update(ticker: Ticker) { let hitObject = this.hitTestSpaceObject(); if (hitObject) { // 撞到東西了,準備自爆 @@ -50,6 +49,6 @@ export class Missile extends SpaceObject { this.destroy(); return; } - super.update(dt); + super.update(ticker); } } diff --git a/src/monster-raiders/Monster.ts b/src/monster-raiders/Monster.ts index ce87845..f954901 100644 --- a/src/monster-raiders/Monster.ts +++ b/src/monster-raiders/Monster.ts @@ -1,6 +1,5 @@ import { SpaceObject } from "./SpaceObject"; -import { Sprite } from "pixi.js"; -import monsterImg from "../images/space-monster.png"; +import { Sprite, Ticker } from "pixi.js"; import { MathUtils } from "../lib/MathUtils"; export class Monster extends SpaceObject { @@ -13,7 +12,7 @@ export class Monster extends SpaceObject { protected init(): void { // 放上怪獸的圖 - let sprite = Sprite.from(monsterImg); + let sprite = Sprite.from('monsterImg'); sprite.pivot.set(56, 66); this.addChild(sprite); // 縮小一點 @@ -31,7 +30,8 @@ export class Monster extends SpaceObject { //this.drawHitCircle(); } - update(dt: number) { + update(ticker: Ticker) { + const dt = ticker.deltaTime; // 先找到玩家戰機 let fighter = this.game.objects.find(obj => { return obj.type == 'fighter'; @@ -40,7 +40,7 @@ export class Monster extends SpaceObject { // 縮短追蹤玩家的時間 this.followDuration -= dt; // 計算兩物件之間的向量 - let vector = fighter.position.sub(this.position); + let vector = fighter.position.subtract(this.position); // 計算戰機對於我的方向(弧度) let radians = Math.atan2(vector.y, vector.x); // 計算和我目前的方向差 @@ -59,6 +59,6 @@ export class Monster extends SpaceObject { this.velocity.set(2.1, 0); this.velocity.rotate(this.rotation); } - super.update(dt); + super.update(ticker); } } diff --git a/src/monster-raiders/MonsterRaidersGame.ts b/src/monster-raiders/MonsterRaidersGame.ts index 0fd693d..76ca371 100644 --- a/src/monster-raiders/MonsterRaidersGame.ts +++ b/src/monster-raiders/MonsterRaidersGame.ts @@ -175,9 +175,8 @@ export class MonsterRaidersGame extends Container { testCamera() { // 製作攝影機的焦點,一個紅色的小圓 let focus = new Graphics(); - focus.beginFill(0xFF0000); - focus.drawCircle(0, 0, 10); - focus.endFill(); + focus.circle(0, 0, 10); + focus.fill(0xFF0000); this.addChild(focus); // 將焦點物件放在畫面中央 focus.x = getStageSize().width / 2; diff --git a/src/monster-raiders/MonsterRaidersGameover.ts b/src/monster-raiders/MonsterRaidersGameover.ts index 32dde70..9f18de9 100644 --- a/src/monster-raiders/MonsterRaidersGameover.ts +++ b/src/monster-raiders/MonsterRaidersGameover.ts @@ -24,16 +24,18 @@ export class MonsterRaidersGameover extends Container { } drawBackground(width: number, height: number) { let graphics = new Graphics(); - graphics.beginFill(0xFFFFFF, 0.5); - graphics.drawRoundedRect(0, 0, width, height, 10); - graphics.endFill(); + graphics.roundRect(0, 0, width, height, 10); + graphics.fill({ color: 0xFFFFFF, alpha: 0.5 }); this.addChild(graphics); } drawGameoverText(y: number) { - let gameoverTxt = new Text('GAME OVER', { - fontFamily: 'SpaceInvadersFont', - fontSize: 64, - fill: 0x990000, + let gameoverTxt = new Text({ + text: 'GAME OVER', + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 64, + fill: 0x990000, + } }); gameoverTxt.resolution = 2; gameoverTxt.position.set( @@ -44,10 +46,13 @@ export class MonsterRaidersGameover extends Container { } drawScoreText(y: number) { let score = this.game.score.toLocaleString(); - let scoreTxt = new Text('SCORE ' + score, { - fontFamily: 'SpaceInvadersFont', - fontSize: 32, - fill: 0x006600, + let scoreTxt = new Text({ + text: 'SCORE ' + score, + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 32, + fill: 0x006600, + } }); scoreTxt.resolution = 2; scoreTxt.position.set( @@ -61,17 +66,19 @@ export class MonsterRaidersGameover extends Container { let button = new Container(); // 幫按鈕加上圓角方形的背景 let bg = new Graphics(); - bg.beginFill(0xFFFFFF); - bg.drawRoundedRect(0, 0, 240, 48, 24); - bg.endFill(); + bg.roundRect(0, 0, 240, 48, 24); + bg.fill(0xFFFFFF); // 預設的按鈕背景底色 bg.tint = 0x283593; button.addChild(bg); // 加再上重玩一次的按鈕標籤 - let label = new Text('Restart', { - fontFamily: 'SpaceInvadersFont', - fontSize: 36, - fill: 0xFFFFFF, + let label = new Text({ + text: 'Restart', + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 36, + fill: 0xFFFFFF, + } }); label.resolution = 2; label.position.set( diff --git a/src/monster-raiders/MonsterRaidersUI.ts b/src/monster-raiders/MonsterRaidersUI.ts index d0116ad..c426d98 100644 --- a/src/monster-raiders/MonsterRaidersUI.ts +++ b/src/monster-raiders/MonsterRaidersUI.ts @@ -1,7 +1,6 @@ import { MonsterRaidersGame } from "./MonsterRaidersGame"; -import { BaseTexture, Container, Graphics, Rectangle, Sprite, Text, Texture } from "pixi.js"; +import { Assets, Container, Graphics, Rectangle, Sprite, Text, Texture } from "pixi.js"; import { FullscreenArea, getStageSize, StageSizeEvents } from "../main"; -import musicNotesImg from "../images/music-notes.png"; export class MonsterRaidersUI extends Container { @@ -31,16 +30,18 @@ export class MonsterRaidersUI extends Container { await document.fonts.load('10px SpaceInvadersFont'); // 畫分數文字的背景 let graphics = new Graphics(); - graphics.beginFill(0x666666, 0.5); - graphics.drawRoundedRect(-50, 0, 100, 28, 14); - graphics.endFill(); + graphics.roundRect(-50, 0, 100, 28, 14); + graphics.fill({ color: 0x666666, alpha: 0.5 }); graphics.position.set(getStageSize().width / 2, 10); this.addChild(graphics); // 新增分數文字 - this.scoreText = new Text('', { - fontFamily: 'SpaceInvadersFont', - fontSize: 24, - fill: 0xFFFFFF, + this.scoreText = new Text({ + text: '', + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 24, + fill: 0xFFFFFF, + } }); this.scoreText.y = 12; this.addChild(this.scoreText); @@ -49,15 +50,15 @@ export class MonsterRaidersUI extends Container { } private async createMusicButton() { // 準備音樂開與關的兩個圖示材質 - let baseTexture = BaseTexture.from(musicNotesImg); - let musicOnTexture = new Texture( - baseTexture, - new Rectangle(0, 0, 64, 64) - ); - let musicOffTexture = new Texture( - baseTexture, - new Rectangle(64, 0, 64, 64) - ); + let baseTexture = Assets.get('musicNotesImg'); + let musicOnTexture = new Texture({ + source: baseTexture, + frame: new Rectangle(0, 0, 64, 64) + }); + let musicOffTexture = new Texture({ + source: baseTexture, + frame: new Rectangle(64, 0, 64, 64) + }); // 建構按鈕的繪圖器(精靈圖) let button = new Sprite(); button.position.set(getStageSize().width - 36, 12); diff --git a/src/monster-raiders/SpaceObject.ts b/src/monster-raiders/SpaceObject.ts index 713a4ab..eed23ad 100644 --- a/src/monster-raiders/SpaceObject.ts +++ b/src/monster-raiders/SpaceObject.ts @@ -1,4 +1,4 @@ -import { Container, Graphics, Point } from "pixi.js" +import { Container, Graphics, Point, Ticker } from "pixi.js" import { ArrayUtils } from "../lib/ArrayUtils"; import { MonsterRaidersGame } from "./MonsterRaidersGame"; /** 宣告SpaceObject為一個抽象類別 */ @@ -27,7 +27,8 @@ export abstract class SpaceObject extends Container { this.game.app.ticker.remove(this.update, this); ArrayUtils.removeItem(this.game.objects, this); } - update(dt: number) { + update(ticker: Ticker) { + const dt = ticker.deltaTime; // 依速度移動 this.x += this.velocity.x * dt; this.y += this.velocity.y * dt; @@ -41,7 +42,7 @@ export abstract class SpaceObject extends Container { } isInScreen(): boolean { const screen = this.game.app.screen; - return this.getBounds().intersects(screen); + return this.getBounds().rectangle.intersects(screen); } /** 檢查碰撞 */ hitTest(other: SpaceObject) { @@ -51,9 +52,8 @@ export abstract class SpaceObject extends Container { /** 畫出碰撞半徑 */ drawHitCircle(color = 0xFF0000) { let graphics = new Graphics(); - graphics.beginFill(color, 0.2); - graphics.drawCircle(0, 0, this.hitRadius); - graphics.endFill(); + graphics.circle(0, 0, this.hitRadius); + graphics.fill({ color: color, alpha: 0.2 }); this.addChild(graphics); } } diff --git a/src/space-invaders/Cannonball.ts b/src/space-invaders/Cannonball.ts index e24dff2..442c279 100644 --- a/src/space-invaders/Cannonball.ts +++ b/src/space-invaders/Cannonball.ts @@ -1,93 +1,95 @@ -import { BaseTexture, Rectangle, Sprite, Texture } from "pixi.js"; +import { Assets, Rectangle, Sprite, Texture, Ticker } from "pixi.js"; import { SpaceInvadersGame } from "./SpaceInvadersGame"; -import cannonballsImage from '../images/cannonballs.png'; import { Invader } from "./Invader"; import { EarthShield } from "./EarthShield"; export class Cannonball { - // 砲彈的圖 - sprite = new Sprite(); + // 砲彈的圖 + sprite = new Sprite(); - constructor( - public game: SpaceInvadersGame, - x: number, - y: number - ) { - // 載入圖片、建立材質、設定精靈圖 - let baseTexture = BaseTexture.from(cannonballsImage); - let textureFrame = this.getSpriteTextureFrame(); - let texture = new Texture(baseTexture, textureFrame); - this.sprite.texture = texture; - // 調整圖片軸心 - this.sprite.pivot.set( - textureFrame.width / 2, - textureFrame.height / 2 - ); - // 把精靈圖放到舞台上的初始位置 - game.app.stage.addChildAt(this.sprite, 0); - this.sprite.position.set(x, y); - // 把移動更新函式加到Ticker - game.app.ticker.add(this.moveUpdate, this); - } - protected getSpriteTextureFrame(): Rectangle { - return new Rectangle(1, 0, 4, 14); - } + constructor( + public game: SpaceInvadersGame, + x: number, + y: number + ) { + // 載入圖片、建立材質、設定精靈圖 + let baseTexture = Assets.get('cannonballsImg'); + let textureFrame = this.getSpriteTextureFrame(); + let texture = new Texture({ + source: baseTexture, + frame: textureFrame, + }); + this.sprite.texture = texture; + // 調整圖片軸心 + this.sprite.pivot.set( + textureFrame.width / 2, + textureFrame.height / 2 + ); + // 把精靈圖放到舞台上的初始位置 + game.app.stage.addChildAt(this.sprite, 0); + this.sprite.position.set(x, y); + // 把移動更新函式加到Ticker + game.app.ticker.add(this.moveUpdate, this); + } + protected getSpriteTextureFrame(): Rectangle { + return new Rectangle(1, 0, 4, 14); + } - destroy() { - this.sprite.destroy(); - this.game.app.ticker.remove(this.moveUpdate, this); - } - get destroyed(): boolean { - return this.sprite.destroyed; - } - /** - * 移動更新函式 - */ - moveUpdate(dt: number) { - let speed = 4; - this.sprite.y -= dt * speed; - // 往上超出舞台範圍時,刪掉自己 - if (this.sprite.y < -this.sprite.height) { - this.destroy(); - } else { - // 取得被撞到的外星人 - let hitInvader = this.hittestInvaders(); - // 如果有找到被撞到的外星人 - if (hitInvader) { - // 呼叫game裏處理毀滅外星人的函式 - this.game.hitAndRemoveInvader(hitInvader); - // 再把自己也銷毀 - this.destroy(); - } else { - // 尋找被撞到的護盾 - let shield = this.hittestShields(); - if (shield) { - // 讓shield進行被擊中的處理 - shield.onHit(); - // 再把自己也清掉 - this.destroy(); - } - } - } - } - /** - * 砲彈的碰撞檢測函式 - * 回傳被打到的外星人 - */ - hittestInvaders(): Invader | undefined { - let bounds = this.sprite.getBounds(); - return this.game.invaders.find((invader) => { - return invader.sprite.getBounds().intersects(bounds); - }); - } - /** - * 砲彈的碰撞檢測函式 - * 回傳被打到的地球護盾 - */ - hittestShields(): EarthShield | undefined { - let bounds = this.sprite.getBounds(); - return this.game.shields.find((shield) => { - return shield.getBounds().intersects(bounds); - }); - } + destroy() { + this.sprite.destroy(); + this.game.app.ticker.remove(this.moveUpdate, this); + } + get destroyed(): boolean { + return this.sprite.destroyed; + } + /** + * 移動更新函式 + */ + moveUpdate(ticker: Ticker) { + let speed = 4; + this.sprite.y -= ticker.deltaTime * speed; + // 往上超出舞台範圍時,刪掉自己 + if (this.sprite.y < -this.sprite.height) { + this.destroy(); + } else { + // 取得被撞到的外星人 + let hitInvader = this.hittestInvaders(); + // 如果有找到被撞到的外星人 + if (hitInvader) { + // 呼叫game裏處理毀滅外星人的函式 + this.game.hitAndRemoveInvader(hitInvader); + // 再把自己也銷毀 + this.destroy(); + } else { + // 尋找被撞到的護盾 + let shield = this.hittestShields(); + if (shield) { + // 讓shield進行被擊中的處理 + shield.onHit(); + // 再把自己也清掉 + this.destroy(); + } + } + } + } + /** + * 砲彈的碰撞檢測函式 + * 回傳被打到的外星人 + */ + hittestInvaders(): Invader | undefined { + let bounds = this.sprite.getBounds(); + return this.game.invaders.find((invader) => { + return invader.sprite.getBounds().rectangle.intersects(bounds.rectangle); + }); + } + /** + * 砲彈的碰撞檢測函式 + * 回傳被打到的地球護盾 + */ + hittestShields(): EarthShield | undefined { + let bounds = this.sprite.getBounds(); + return this.game.shields.find((shield) => { + return shield.getBounds().rectangle.intersects(bounds.rectangle); + }); + } } diff --git a/src/space-invaders/EarthShield.ts b/src/space-invaders/EarthShield.ts index d1b6549..3216848 100644 --- a/src/space-invaders/EarthShield.ts +++ b/src/space-invaders/EarthShield.ts @@ -6,9 +6,8 @@ export class EarthShield extends Graphics { constructor(public game: SpaceInvadersGame, x: number, y: number) { super(); - this.beginFill(0x00FF00); - this.drawRect(-10, -10, 20, 20); - this.endFill(); + this.rect(-10, -10, 20, 20); + this.fill(0x00FF00); this.position.set(x, y); } onHit() { diff --git a/src/space-invaders/Invader.ts b/src/space-invaders/Invader.ts index afeba90..3c68dbd 100644 --- a/src/space-invaders/Invader.ts +++ b/src/space-invaders/Invader.ts @@ -1,6 +1,5 @@ -import { BaseTexture, Rectangle, Sprite, Texture } from "pixi.js"; +import { Assets, Rectangle, Sprite, Texture } from "pixi.js"; import { SpaceInvadersGame } from "./SpaceInvadersGame"; -import invadersImage from '../images/invaders.png'; import { wait } from "../main"; import { playSound } from "../lib/SoundUtils"; import invaderKilledSnd from '../sounds/invaderKilled.wav'; @@ -16,10 +15,13 @@ export class Invader { type: number, // 造型(0,1,2,3) ) { // 載入圖片 - let baseTexture = BaseTexture.from(invadersImage); + let baseTexture = Assets.get('invadersImg'); // 建立材質 let imageRect = new Rectangle(50 * type, 0, 50, 34); - let texture = new Texture(baseTexture, imageRect); + let texture = new Texture({ + source: baseTexture, + frame: imageRect + }); // 指定精靈圖的材質 this.sprite.texture = texture; // 把精靈圖放到舞台上 @@ -86,7 +88,7 @@ export class Invader { playSound(invaderKilledSnd, { volume: 0.2 }); // 改變材質在基礎材質上的矩形(換成最右側的50x34) const texture = this.sprite.texture; - texture.frame = new Rectangle(200, 0, 50, 34); + texture.frame.copyFrom(new Rectangle(200, 0, 50, 34)); await wait(10); this.destroy(); } diff --git a/src/space-invaders/InvaderBoss.ts b/src/space-invaders/InvaderBoss.ts index 2625c10..bdbee1a 100644 --- a/src/space-invaders/InvaderBoss.ts +++ b/src/space-invaders/InvaderBoss.ts @@ -1,4 +1,4 @@ -import { Point } from "pixi.js"; +import { Point, Ticker } from "pixi.js"; import { getStageSize, wait } from "../main"; import { Invader } from "./Invader"; import { SpaceInvadersGame } from "./SpaceInvadersGame"; @@ -66,13 +66,14 @@ export class InvaderBoss extends Invader { this.rotateSpeed *= -1; } } - private attackUpdate(dt: number) { + private attackUpdate(ticker: Ticker) { + const dt = ticker.deltaTime; // 取得目前速率 let currSpeed = this.velocity.length(); // 以0.02的加速度加快速率,最大值為4 let speed = Math.min(4, currSpeed + 0.02 * dt); // 將速度的長度調整為新的速率 - this.velocity.normalize(speed); + this.velocity.scale(speed / currSpeed); // 如果還有旋轉時間 if (this.rotateTime > 0) { // 縮短旋轉時間 @@ -96,7 +97,8 @@ export class InvaderBoss extends Invader { // 魔王先跳回畫面上方 this.y = -this.height; } - private backUpdate(dt: number) { + private backUpdate(ticker: Ticker) { + const dt = ticker.deltaTime; const target = this.posInFlock; // 將 y 以 1 的速率靠近 目標.y this.y = Math.min(target.y, this.y + 1 * dt); diff --git a/src/space-invaders/InvaderDrop.ts b/src/space-invaders/InvaderDrop.ts index e57cf58..148d976 100644 --- a/src/space-invaders/InvaderDrop.ts +++ b/src/space-invaders/InvaderDrop.ts @@ -1,4 +1,4 @@ -import { Rectangle } from "pixi.js"; +import { Rectangle, Ticker } from "pixi.js"; import { getStageSize } from "../main"; import { Cannonball } from "./Cannonball"; @@ -10,10 +10,10 @@ export class InvaderDrop extends Cannonball { /** * 外星人飛彈的移動函式 */ - moveUpdate(dt: number) { + moveUpdate(ticker: Ticker) { const sprite = this.sprite; let speed = 2; - sprite.y += dt * speed; + sprite.y += ticker.deltaTime * speed; // 往下超出舞台範圍時,刪掉自己 if (sprite.y > getStageSize().height + sprite.height) { @@ -24,7 +24,7 @@ export class InvaderDrop extends Cannonball { if (!cannon.dead) { const cannonBounds = cannon.sprite.getBounds(); // 測試有沒有撞到玩家砲台 - if (cannonBounds.intersects(sprite.getBounds())) { + if (cannonBounds.rectangle.intersects(sprite.getBounds().rectangle)) { // 呼叫game裏處理砲台毀壞的函式 this.game.hitPlayerCannon(); // 再把自己也銷毀 diff --git a/src/space-invaders/PlayerCannon.ts b/src/space-invaders/PlayerCannon.ts index 4168475..182d9fc 100644 --- a/src/space-invaders/PlayerCannon.ts +++ b/src/space-invaders/PlayerCannon.ts @@ -1,13 +1,11 @@ -import { BaseTexture, Rectangle, Sprite, Texture } from "pixi.js"; +import { Assets, Rectangle, Sprite, Texture, Ticker } from "pixi.js"; import { SpaceInvadersGame } from "./SpaceInvadersGame"; -import cannonImage from '../images/cannon.png'; import { getStageSize, wait } from "../main"; import { keyboardManager } from "../lib/keyboard/KeyboardManager"; import { KeyCode } from "../lib/keyboard/KeyCode"; import { Cannonball } from "./Cannonball"; import cannonShootSnd from '../sounds/cannonShoot.wav'; import { playSound } from "../lib/SoundUtils"; -import invadersImage from '../images/invaders.png'; import cannonExplodeSnd from '../sounds/cannonExplode.wav'; export class PlayerCannon { @@ -22,9 +20,9 @@ export class PlayerCannon { constructor(public game: SpaceInvadersGame) { // 載入圖片 - let baseTexture = BaseTexture.from(cannonImage); + // let baseTexture = Assets.get('cannonImg'); // 建立材質 - let texture = Texture.from(baseTexture); + let texture = Assets.get('cannonImg'); // 新增精靈圖 this.sprite.texture = texture; // 把精靈圖放到舞台上 @@ -36,13 +34,14 @@ export class PlayerCannon { stageSize.height ); // 依流程調整圖片軸心 - if (baseTexture.valid) { - this.adjustPivot(); - } else { - baseTexture.once('loaded', () => { - this.adjustPivot(); - }); - } + // if (baseTexture.valid) { + // this.adjustPivot(); + // } else { + // baseTexture.once('loaded', () => { + // this.adjustPivot(); + // }); + // } + this.adjustPivot(); // 開始進行砲台移動 game.app.ticker.add(this.moveUpdate, this); // 開始進行砲台射擊 @@ -71,10 +70,10 @@ export class PlayerCannon { * 砲台移動的更新函式 * @param dt 經過時間 */ - private moveUpdate(dt: number) { + private moveUpdate(ticker: Ticker) { const sprite = this.sprite; let x = sprite.x; - let distance = dt * this.moveSpeed; + let distance = ticker.deltaTime * this.moveSpeed; if (keyboardManager.isKeyDown(KeyCode.LEFT)) { x -= distance; @@ -102,15 +101,15 @@ export class PlayerCannon { private hittestInvaders() { let bounds = this.sprite.getBounds(); return this.game.invaders.find((invader) => { - return invader.sprite.getBounds().intersects(bounds); + return invader.sprite.getBounds().rectangle.intersects(bounds.rectangle); }); } /** * 砲台射擊的更新函式 * @param dt 經過時間 */ - private shootUpdate(dt: number) { - this.shootCooldown -= dt; + private shootUpdate(ticker: Ticker) { + this.shootCooldown -= ticker.deltaTime; if ( this.shootCooldown <= 0 && keyboardManager.isKeyDown(KeyCode.SPACE) @@ -133,9 +132,12 @@ export class PlayerCannon { // 播放爆炸音效 playSound(cannonExplodeSnd, { volume: 0.2 }); // 改變材質為外星人的材質基底最右側的frame - const baseTexture = BaseTexture.from(invadersImage); + const baseTexture = Assets.get('invadersImg'); const frame = new Rectangle(200, 0, 50, 34); - const texture = new Texture(baseTexture, frame); + const texture = new Texture({ + source: baseTexture, + frame: frame, + }); // 改用外星人被擊落時的特效 this.sprite.texture = texture; this.sprite.pivot.set(frame.width / 2, frame.height); @@ -146,4 +148,4 @@ export class PlayerCannon { // 自我清除 this.destroy(); } -} \ No newline at end of file +} diff --git a/src/space-invaders/SpaceInvadersGameover.ts b/src/space-invaders/SpaceInvadersGameover.ts index 8c406ec..2e928d0 100644 --- a/src/space-invaders/SpaceInvadersGameover.ts +++ b/src/space-invaders/SpaceInvadersGameover.ts @@ -23,21 +23,23 @@ export class SpaceInvadersGameover extends Container { } private createBackground() { let graphics = new Graphics(); - graphics.beginFill(0, 0.8); - graphics.drawRect( + graphics.rect( 0, 30, getStageSize().width, getStageSize().height - 30 ); - graphics.endFill(); + graphics.fill({ color: 0, alpha: 0.8 }); this.addChild(graphics); } private createGameoverText() { - let text = new Text('GAME OVER', { - fontFamily: 'SpaceInvadersFont', - fontSize: 48, - fill: '#FF0000', + let text = new Text({ + text: 'GAME OVER', + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 48, + fill: '#FF0000', + } }); text.position.set( (getStageSize().width - text.width) / 2, @@ -46,10 +48,13 @@ export class SpaceInvadersGameover extends Container { this.addChild(text); } private async createRestartText() { - let text = new Text('press SPACE to try again', { - fontFamily: 'SpaceInvadersFont', - fontSize: 24, - fill: '#FFFFFF', + let text = new Text({ + text: 'press SPACE to try again', + style: { + fontFamily: 'SpaceInvadersFont', + fontSize: 24, + fill: '#FFFFFF', + } }); text.position.set( (getStageSize().width - text.width) / 2, diff --git a/src/space-invaders/SpaceInvadersUI.ts b/src/space-invaders/SpaceInvadersUI.ts index 045996c..abdf3f0 100644 --- a/src/space-invaders/SpaceInvadersUI.ts +++ b/src/space-invaders/SpaceInvadersUI.ts @@ -1,5 +1,4 @@ -import { BaseTexture, Container, Sprite, Text } from "pixi.js"; -import cannonImage from '../images/cannon.png'; +import { Assets, Container, Sprite, Text } from "pixi.js"; import { getStageSize, wait } from "../main"; export class SpaceInvadersUI extends Container { @@ -34,10 +33,13 @@ export class SpaceInvadersUI extends Container { /** 方便新增文字繪圖器的函式 */ private createText(label: string, color: string, x: number, y: number) { // 新增Pixi提供的Text物件 - let text = new Text(label, { - fontFamily: '"SpaceInvadersFont"', - fontSize: 24, - fill: color, + let text = new Text({ + text: label, + style: { + fontFamily: '"SpaceInvadersFont"', + fontSize: 24, + fill: color, + } }); // 提高文字的解析度 text.resolution = 2; @@ -74,7 +76,7 @@ export class SpaceInvadersUI extends Container { sprite?.destroy(); } // 準備砲台的材質基底備用 - let baseTexture = BaseTexture.from(cannonImage); + let baseTexture = Assets.get('cannonImg'); // 補足不夠的砲台生命圖 while (this.liveSprites.length < this.lives) { // 下一個生命圖的index diff --git a/src/space-invaders/spaceInvadersPreload.ts b/src/space-invaders/spaceInvadersPreload.ts new file mode 100644 index 0000000..dd7968d --- /dev/null +++ b/src/space-invaders/spaceInvadersPreload.ts @@ -0,0 +1,14 @@ +import { Assets } from 'pixi.js'; +import cannonImg from '../images/cannon.png'; +import cannonballsImg from '../images/cannonballs.png'; +import invadersImg from '../images/invaders.png'; + +export async function spaceInvadersPreload() { + let assets = [ + { alias: 'cannonImg', src: cannonImg }, + { alias: 'cannonballsImg', src: cannonballsImg }, + { alias: 'invadersImg', src: invadersImg }, + ]; + Assets.add(assets); + await Assets.load(assets.map(asset => asset.alias)); +} \ No newline at end of file diff --git a/src/test/PointUtils.test.ts b/src/test/PointUtils.test.ts index 39ba74b..e553cd8 100644 --- a/src/test/PointUtils.test.ts +++ b/src/test/PointUtils.test.ts @@ -5,8 +5,7 @@ import { test, expect } from 'vitest' test('兩種IPoint類別的向量長度', () => { let point = new Point(3, 4); let obPoint = new ObservablePoint( - () => { }, - null, + { _onUpdate: () => { } }, 13500, 12709 ); @@ -16,18 +15,18 @@ test('兩種IPoint類別的向量長度', () => { test('向量正規化', () => { let point = new Point(3, 4); - expect(point.normalize(100)).toBe(5); + // expect(point.normalize(100)).toBe(5); expect(point.length()).toBe(100); }) -test('向量加減', () => { - let point = new Point(3, 4); - - point = point.add(new Point(10, 10)); - expect(point).toEqual(new Point(13, 14)) - - point = point.sub(new Point(1, 1)); - expect(point).toEqual(new Point(12, 13)) -}) +// test('向量加減', () => { +// let point = new Point(3, 4); + +// point = point.add(new Point(10, 10)); +// expect(point).toEqual(new Point(13, 14)) + +// point = point.sub(new Point(1, 1)); +// expect(point).toEqual(new Point(12, 13)) +// }) test('向量旋轉', () => { let point = new Point(3, 4); point.rotate(Math.PI / 2); diff --git a/src/tree-generator/Branch.ts b/src/tree-generator/Branch.ts index 6e67306..4e43561 100644 --- a/src/tree-generator/Branch.ts +++ b/src/tree-generator/Branch.ts @@ -237,7 +237,7 @@ export class Branch { const options = this.options; const start = options.position; // 樹枝生長方向的向量 = 生長終點 - 起點 - let vector = this.getEndPosition().sub(start); + let vector = this.getEndPosition().subtract(start); // 在生長到percent時的終點 let end = new Point( start.x + vector.x * percent, @@ -246,7 +246,7 @@ export class Branch { // 準備畫線,先清除之前畫的東西 this.graphics.clear(); // 設定畫線筆刷 - this.graphics.lineStyle({ + this.graphics.setStrokeStyle({ width: options.size, color: options.color, }); @@ -254,6 +254,7 @@ export class Branch { this.graphics.moveTo(start.x, start.y); // 畫線到終點 this.graphics.lineTo(end.x, end.y); + this.graphics.stroke(); // 記錄我們現在畫到哪兒了 this.drawnPercent = percent; } diff --git a/src/tree-generator/TreeGenerator.ts b/src/tree-generator/TreeGenerator.ts index 77ec99a..74aa393 100644 --- a/src/tree-generator/TreeGenerator.ts +++ b/src/tree-generator/TreeGenerator.ts @@ -1,4 +1,4 @@ -import { Application, Point } from "pixi.js"; +import { Application, Point, Ticker } from "pixi.js"; import { getStageSize } from "../main"; import { Branch } from "./Branch"; import { OptionsEditor } from "./OptionsEditor"; @@ -68,12 +68,11 @@ export class TreeGenerator { } /** * 畫圖用的更新函式 - * @param deltaTime */ - drawUpdate(deltaTime: number): void { + drawUpdate(ticker: Ticker): void { const data = this.drawingData; if (data) { - data.timepassed += deltaTime; + data.timepassed += ticker.deltaTime; data.mainTrunk.drawDeeply(data.timepassed); } }